四、数据流
接口DataInput和DataOutput --设计了较为高级的数据输入输出方式:
除了可处理字节和字节数组外,还可以处理 int、float、boolean 等基本数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,如 read(), readInt(), readByte()…; write(), writeChar(), writeBoolean()…此外,还可以用 readLine()方法读取一行信息。
方法:
方法 | 返回值 | 说明 |
---|---|---|
readBoolean() | boolean | |
readByte() | byte | |
readShort() | short | |
readChar() | char | |
readInt() | int | |
readLong() | long | |
readDouble() | double | |
readFloat() | float | |
readUnsignedByte() | int | |
readUnsignedShort() | int | |
readFully(byte[] b) | void | 从输入流中读取一些字节,并将它们存储在缓冲区数组 b 中 |
reaFully(byte[] b, int off,int len) | void | 从输入流中读取 len 个字节 |
skipBytes(int n) | int | 与 InputStream.skip 等价 |
readUTF() | String | 按照 UTF-8 形式从输入中读取字符串 |
readLine() | String | 按回车(\r)换行(\n)为分割符读取一行字符串,不完全支持 UNICODE |
writeBoolean(boolean v) | void | |
writeByte(int v) | void | |
writeShort(int v) | void | |
writeChar(int v) | void | |
writeInt(int v) | void | |
writeLong(long v) | void | |
writeFloat(float v) | void | |
writeDouble(double v) | void | |
write(byte[] b) | void | 与 OutputStream.write 同义 |
write(byte[] b, int off, int len) | void | 与 OutputStream.write 同义 |
write(int b) | void | 与 OutputStream.write 同义 |
writeBytes(String s) | void | 只输出每个字符的低 8 位;不完全支持 UNICODE |
writeChars(String s) | void | 每个字符在输出中都占两个字节 |
数据流类 DataInputStream 和 DataOutputStream 的处理对象除了是字节或字节数组外,还可以实现对文件的不同数据类型的读写:
1.分别实现了 DataInput 和 DataOutput 接口
2.在提供字节流的读写手段同时,以统一的形式向输入流中写入 boolean,int,long,double 等基本数据类型,并可以再次把基本数据类型的值读取回来。
3.提供了字符串读写的手段
数据流可以连接一个已经建立好的数据对象,例如网络连接、文件等。数据流可以通过如下方式建立:
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
DataInputStream dis = new DataInputStream(fis);
DataOutputStream dos = new DataOutputStream(fos);
五、标准流、内存读写流、顺序输入流
1.标准流
语言包java.lang中的System类管理标准输入/输出流和错误流。
System.in从InputStream中继承而来,用于从标准输入设备中获取输入数据(通常是键盘)
System.out从PrintStream(OutputStream的子类)中继承而来,把输入送到缺省的显示设备(通常是显示器)
System.err也是从PrintStream中继承而来,把错误信息送到缺省的显示设备(通常是显示器)
每当 main 方法被执行时,就会自动生产上述三个对象。
2.内存读写流
为了支持在内存上的I/O,java.io中提供了类:
ByteArrayInputStream、ByteArrayOutputStream和StringBufferInputStream
1)ByteArrayInputStream 可以从指定的字节数组中读取数据
2)ByteArrayOutputStream 中提供了缓冲区可以存放数据(缓冲区大小可以在构造方法中设定,缺省为 32),可以用 write() 方法向其中写入数据,然后用 toByteArray() 方法将缓冲区中的有效字节写到字节数组中去。size() 方法可以知道写入的字节数;reset() 可以丢弃所有内容。
3)StringBufferInputStream 与 ByteArrayInputStream 相类似,不同点在于它是从字符缓冲区 StringBuffer 中读取 16 位的 Unicode 数据,而不是 8 位的字节数据(已被 StringReader 取代)
3.顺序输入流
java.io中提供了类SequenceInputStream,使应用程序可以将几个输入流顺序连接起来。顺序输入流提供了将多个不同的输入流统一为一个输入流的功能,这使得程序可能变得更加简洁。
eg:
FileInputStream f1,f2;
String s;
f1 = new FileInputStream("file1.txt");
f2 = new FileInputStream("file2.txt");
SequenceInputStream fs = new SequenceInputStream(f1,f2);
DataInputStream ds = new DataInputStream(fs);
while((s = ds.readLine()) != null){
System.out.println(s);
}
参考自实验楼。不完整,待续。