包装类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个字节开始读的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DataInputStreamDataOutputStream 之间可以通过使用缓冲区对象进行相互转化,例如 ByteArrayInputStream 和 ByteArrayOutputStream。 ### 回答2: DataInputStreamDataOutputStream是Java IO库中的两个类,用于处理基本数据类型的输入和输出。DataInputStream可以从InputStream中读取基本数据类型的数据,而DataOutputStream可以将基本数据类型的数据写入OutputStream中。 要相互转换DataInputStreamDataOutputStream对象,可以使用Java的管道流来实现。具体步骤如下: 1. 首先,创建一个InputStreamOutputStream对象作为中间介质。可以使用ByteArrayInputStream和ByteArrayOutputStream来创建,这两个类实现了对字节数组的读取和写入。 2. 将DataOutputStream与ByteArrayOutputStream关联起来,使其可以将基本数据类型的数据写入到字节数组中。 ```java ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); ``` 3. 将DataInputStream与ByteArrayInputStream关联起来,使其可以从字节数组中读取基本数据类型的数据。 ```java byte[] byteArray = byteArrayOutputStream.toByteArray(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream); ``` 现在,你可以使用dataOutputStream将基本数据类型的数据写入byteArrayOutputStream,然后再使用dataInputStream从byteArrayInputStream中读取这些基本数据类型的数据。两个类已经相互转换成功。 例如,你可以使用dataOutputStream将整数写入字节数组: ```java dataOutputStream.writeInt(100); ``` 然后,使用dataInputStream从字节数组中读取该整数: ```java int number = dataInputStream.readInt(); ``` 这样,你就成功地将DataInputStreamDataOutputStream对象相互转化了。注意,在转换过程中,需要注意字节数组的大小和读取写入的顺序,以确保数据能够正确地被读取和写入。 ### 回答3: DataInputStream数据输入流)和DataOutputStream数据输出流)是Java中用于读取和写入二进制数据的两个类。要相互转化,可采用以下步骤: 1. 创建一个FileInputStream(文件输入流)或FileOutputStream(文件输出流)对象,用于读取或写入文件。 2. 在FileInputStream或FileOutputStream对象上创建一个DataInputStreamDataOutputStream对象,分别用于读取或写入二进制数据。 3. 使用DataInputStream对象的readXXX()方法(如readInt()、readFloat())读取二进制数据,或使用DataOutputStream对象的writeXXX()方法(如writeInt()、writeFloat())写入二进制数据。 4. 关闭DataInputStreamDataOutputStream对象,确保数据被正确地写入或读取。 5. 若要将DataInputStream对象转换为DataOutputStream对象,则需要使用DataOutputStream的构造函数将其包装在其中。 以下是一个示例代码,演示了如何将DataInputStreamDataOutputStream相互转化: ```java import java.io.*; public class DataStreamConversion { public static void main(String[] args) { try { // 创建一个输出文件并用DataOutputStream写入数据 FileOutputStream fileOutputStream = new FileOutputStream("data.bin"); DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream); dataOutputStream.writeInt(123); dataOutputStream.writeDouble(3.14); dataOutputStream.writeBoolean(true); dataOutputStream.close(); // 创建一个输入文件并用DataInputStream读取数据 FileInputStream fileInputStream = new FileInputStream("data.bin"); DataInputStream dataInputStream = new DataInputStream(fileInputStream); int intValue = dataInputStream.readInt(); double doubleValue = dataInputStream.readDouble(); boolean booleanValue = dataInputStream.readBoolean(); dataInputStream.close(); System.out.println("读取到的整数值:" + intValue); System.out.println("读取到的浮点数值:" + doubleValue); System.out.println("读取到的布尔值:" + booleanValue); } catch(IOException e) { e.printStackTrace(); } } } ``` 这样,我们就成功地使用DataInputStreamDataOutputStream进行了相互转化,将二进制数据从文件写入并从文件读取回来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值