总结
流就是数据比特,其中类名带有File
的就是文件相关的流,带有buffered
就是有缓冲作用的流,通过缓存数据让数据一次性处理,可以减少io操作进而增加传输速度。但同时在发送时需要注意flush()
,也就是让没有达到发送门槛的数据发送,否则如果后面没有数据会导致数据无法发送 Data相关是封装了byte的流,也就是可以接受和返回int等类型的流,无需再转成byte或者从byte换成各种类型(这样确实方便
Reader和Writer是在原来的基础上更加注重文本编码
,同时处理的是字符而不是byte。其子类InputStreamReader
和InputStreamReader
将以流和编码类型为参数实例化
最后所有创建的类都要注意close()
来关闭资源
下面是类的关系图
graph LR classDef base fill:#f9f,stroke:#333,stroke-width:2px classDef filter fill:#ccf,stroke:#333,stroke-width:2px classDef buffered fill:#9cf,stroke:#333,stroke-width:2px classDef data fill:#6cf,stroke:#333,stroke-width:2px classDef readerWriter fill:#fcc,stroke:#333,stroke-width:2px InputStream[InputStream]:::base --> FileInputStream[FileInputStream]:::base InputStream[InputStream]:::base --> FilterInputStream[FilterInputStream]:::filter FilterInputStream[FilterInputStream]:::filter --> BufferedInputStream[BufferedInputStream]:::buffered FilterInputStream[FilterInputStream]:::filter --> DataInputStream[DataInputStream]:::data OutputStream[OutputStream]:::base --> FileOutputStream[FileOutputStream]:::base OutputStream[OutputStream]:::base --> FilterOutputStream[FilterOutputStream]:::filter FilterOutputStream[FilterOutputStream]:::filter --> BufferedOutputStream[BufferedOutputStream]:::buffered FilterOutputStream[FilterOutputStream]:::filter --> DataOutputStream[DataOutputStream]:::data Reader[Reader]:::readerWriter --> FileReader[FileReader]:::readerWriter Reader[Reader]:::readerWriter --> InputStreamReader[InputStreamReader]:::readerWriter InputStreamReader[InputStreamReader]:::readerWriter --> BufferedReader[BufferedReader]:::buffered Writer[Writer]:::readerWriter --> FileWriter[FileWriter]:::readerWriter Writer[Writer]:::readerWriter --> OutputStreamWriter[OutputStreamWriter]:::readerWriter OutputStreamWriter[OutputStreamWriter]:::readerWriter --> BufferedWriter[BufferedWriter]:::buffered Writer[Writer]:::readerWriter --> PrintWriter[PrintWriter]:::readerWriter
基类输入输出流
java.io.OutputStream
抽象类
有方法如下
// 仅写入一个字节
abstract void write(int b)
// 写入大量数据
void write(byte[] data)
// 可以设置偏移和写入的大小
void write(byte[] data, int offset, int length)
// 发送缓存的数据
void flush()
// 关闭流
void close()
在实际写入过程中,数据需要达到一定量才会发送,使用flush()
可以使得没有达到门槛的数据立即发送。
java.io.InputStream
同为抽象类
有方法如下
abstract int read()
// 读入1字节内容 返回这个字节转换成int类型 在末尾则返回-1
// 使用这个需要手动将int转换为无符号字节
int read(byte[] input)
// 可以设置偏移和读入的大小
int read(byte[] input, int offset, int length)
// 跳过不读取
long skip(long n)
// 返回可以读取的最少字节数
int available()
// 关闭流
void close()
缓冲流
BufferedInputStream
是InputStream
的一个子类,它会在内存中添加一个缓冲区,当从BufferedInputStream
读取数据时,首先尝试从缓冲区中获取数据,当缓冲区中的数据被耗尽时,BufferedInputStream
才会从底层数据源读取更多的数据填充缓冲区。这种方法减少了实际的I/O操作次数,从而提高了性能。
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int bufferSize)
相应的,BufferedOutputStream
是outputStream
的一个子类,写入时也会创建缓冲区,因此发送数据需要手动刷新输出流,即flush()
数据流
DataInputStream
封装了FilterInputStream
可以处理特定的类型
并且所有方法都被final
修饰了,无法再被重写
构造函数public DataInputStream(InputStream in)
需要以输入流为参数
可以读取对应类型的函数
final int read(byte[] b)
final int read(byte[] b, int off, int len)
final int readUnsignedByte()
public final short readShort()
public final int readUnsignedShort()
public final char readChar()
public final int readInt()
public final long readLong()
public final float readFloat()
public final double readDouble()
public final String readUTF()
public final boolean readBoolean
public final byte readByte()
public final void readFully(byte[] b)
DataWriteStream
相同
Reader
和Writer
二者都是抽象类,作用是把流的byte转换为文本,与原来的DataxxStream
不同点在于其子类处理的是字符而非byte,也更注重文本编码
(上面的最多只有utf-8
相同的
读取文件时使用带有File
的子类FileReader("input.txt")
和FileWriter("output.txt")
使用文件路径作为参数
二者子类InputStreamReader
和OutputStreamWriter
将流作为参数,同时需要指定文本编码
即
Writer writer = new OutputStreamWriter(outputStream out, "UTF-8");
writer.write("Hello, World!");
writer.close();
Reader reader = new InputStreamReader(InputStream in, "UTF-8");
char[] buffer = new char[1024];
int length;
while ((length = reader.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, length));
}
此外两个子类还有子类 BufferedReader
和BufferedWriter
同样是缓冲功能 提高效率,同时BufferedReader
可以使用readLine()
读取一行
Reader reader = new BufferedReader(new FileReader("input.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();