数据输入/输出流(DataInputStream类与DataOutputStream类)允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。也就是说,当读取一个数据时,不必再关心这个数值应当是哪种字节。不过这样的文件用记事本等无法阅读。
目录
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()方法向目标设备中写入字符串的长度,所以也能准确地读回写入字符串。