java之IO系列05——数据(二进制)输入/输出流

数据输入/输出流(DataInputStream类与DataOutputStream类)允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。也就是说,当读取一个数据时,不必再关心这个数值应当是哪种字节。不过这样的文件用记事本等无法阅读。

目录

1、DataOutputStream

2、DataInputStream

3、案例


1、DataOutputStream

//构造方法
DataOutputStream(OutputStream out) //创建一个新的数据输出流,将数据写入到指定的基本输出流中

//常用方法
void flush() //刷新数据输出流。  
int size() 
void write(byte[] b, int off, int len)   
void write(int b) //只写int最低位的一个字节,即最低的8位二进制数
void writeBoolean(boolean v)   
void writeByte(int v)   
void writeBytes(String s) //只是将字符串中的每一个字符的低字节内容写入目标设备中
void writeChar(int v)   
void writeChars(String s)  //将字符串中的每一个字符的两个字节的内容都写到目标设备中
void writeDouble(double v) 
void writeFloat(float v)   
void writeInt(int v)   
void writeLong(long v)   
void writeShort(int v)  
void writeUTF(String str) //将字符串按照UTF编码后的字节长度写入目标设备,然后才是每一个字节的UTF编码

2、DataInputStream

//构造方法
DataInputStream(InputStream in) //使用指定的基础InputStream创建一个DataInputStream。 

//常用方法
int read(byte[] b)  
int read(byte[] b, int off, int len) 
boolean readBoolean()   
byte readByte()  
char readChar()   
double readDouble()   
float readFloat()  
void readFully(byte[] b)   
void readFully(byte[] b, int off, int len)   
int readInt()   
long readLong()   
short readShort()   
int readUnsignedByte()   
int readUnsignedShort()  
String readUTF() 
static String readUTF(DataInput in)   
int skipBytes(int n) 

3、案例

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStreamTest {
	public static void main(String[] args)
	{
		try {
			FileOutputStream fos = new FileOutputStream("E:/dir/r.txt");
			DataOutputStream dos = new DataOutputStream(fos);
			dos.writeUTF("使用writeUTF()方法写入数据");//将字符串按照UTF编码后的字节长度写入目标设备,然后才是每一个字节的UTF编码
			dos.writeChars("使用writeChars()方法写入数据!");//将字符串中的每一个字符的两个字节的内容都写到目标设备中
			//dos.writeBytes("使用writeBytes()方法写入数据!");//只是将字符串中的每一个字符的低字节内容写入目标设备中,因为这样,writeBytes不适用于汉字的写入
			dos.writeBytes("1234ABC");
			dos.close();
			fos.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
		try {
			FileInputStream fis = new FileInputStream("E:/dir/r.txt");
			DataInputStream dis = new DataInputStream(fis);
			System.out.println(dis.readUTF());//使用readUTF可以将writeUTF写入的直接读出
			
			char c = '!';
			while((c=dis.readChar())!='!') {//readChar一次只能读一个
				System.out.print(c);
			}
			System.out.println();
			
			//System.out.println(dis.readByte());//这样并不能直接将writeBytes写入的数据读出来,得到的是他们的十进制的值。
			//怎么才能将writeBytes写入的数据读出来呢??
			for(int i=0;i<5;i++)
			{
				System.out.print((char)dis.readByte());//可以直接强制转换
			}
			dis.close();
			fis.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

通过案例发现,writeUTF()方法写入的数据使用readUTF可以直接读出,但是writeChars()和writeBytes()方法写入的数据就不能直接读出了,原因在于:由于Java中的字符是Unicode编码,是双字节的,writeBytes只是将字符串中的每一个字符的低字节内容写入目标设备中;而writeChars将字符串中的每一个字符的两个字节的内容都写到目标设备中;writeUTF将字符串按照UTF编码后的字节长度写入目标设备,然后才是每一个字节的UTF编码。DataInputStream类只提供了一个readUTF()方法返回字符串。这是因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道这个字符串的长度,就无法知道读取到什么位置才是这个字符串的结束。DataOutputStream类中只有writeUTF()方法向目标设备中写入字符串的长度,所以也能准确地读回写入字符串。

你可能感兴趣的:(JAVA,java,字符串)