DataOutputStream、DataInputStream

包装类DataOutputStream、DataInputStream为我们提供了多种对文件的写入和读取方法,

如writeBoolean(),writeUTF(),writeChar,writeByte(),writeDouble()等和对应的read方法,

这些方法极大的方便了我们的写入和读取操作,下面结合一个程序来探讨一下这些方法的使用。

 

import java.io.*;
public class TestDataStream {

 public static void main(String[] args) throws Exception {
  
  FileOutputStream fos=new FileOutputStream("data.txt");
  BufferedOutputStream bos=new BufferedOutputStream(fos);
  DataOutputStream dos=new DataOutputStream(bos);
  
  FileInputStream fis=new FileInputStream("data.txt");
  BufferedInputStream bis=new BufferedInputStream(fis);
  DataInputStream dis=new DataInputStream(bis);
  
  String str="你好hi";
  dos.writeUTF(str);   //按UTF-8格式写入
  dos.writeChars(str); //按字符写入
  //按字节写入有两种方法,第一种方法只能适应无汉字的情况;
  //因为方法1在写入时会把所有的字符都按1个字节写入,而汉字的表示需要2个字节,
  //这就造成了数据的丢失,读入时就会出现乱码。
  //而方法2在将字符串转换为字节数组时就把汉字字符变为了2个字节,
  //写入文件的时候也会按2个字节的文字写入,这样读取的时候就不会出现问题
  dos.writeBytes(str);//方法1:将整个字符串按字节写入
  byte[] b=str.getBytes();
  dos.write(b);  //方法2:将字符串转换为字节数组后再逐一写入
  dos.close();
  //按UTF-8格式读取

  System.out.println(dis.readUTF());
  //字符读取
  char [] c=new char[4];
  for(int i=0;i<4;i++){     
   c[i]=dis.readChar();   //读取4个字符
  }
  System.out.print(new String(c,0,4));
  System.out.println();
  //字节读取

  byte [] b1=new byte[4];
  dis.read(b1); //读取4个字节
  System.out.print(new String(b1,0,4));//输出时会出现乱码
  System.out.println();
  
  byte [] b2=new byte[1024];
  int len=dis.read(b2); //按字节读取剩余的内容
  System.out.println(new String(b2,0,len));
 }

}

输出结果为:

你好hi
你好hi
`}hi
你好hi

 

注意1:一般情况下在读入时尽量按照写入时的格式进行读取,

否则有可能会出现显示乱码或程序出现异常。

如首先写入文件用的是writeUTF(),在读取的时候如果不是用readUTF()就会出现乱码,

如果readUTF()读取的内容不是UTF-8格式的,程序就会抛出异常。

 

注意2:如程序中注释所说,对于出现汉字字符的情况不能用writeBytes(),这会在写入文件时丢弃汉字字符的第一个字节从而在读取时出现错误。

 

注意3:所有的读取方法都是共享一个位置指示器的,即在前面的read方法执行后,后面再执行其他read方法都是从上一个read方法读取到的位置开始向后读取的。如开始执行了1次readByte()后面的readChar是从第2个字节开始读的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值