java网络编程-流

24 年 5 月 24 日 星期五 (已编辑)
999 字
5 分钟

总结

就是数据比特,其中类名带有File的就是文件相关的流,带有buffered就是有缓冲作用的流,通过缓存数据让数据一次性处理,可以减少io操作进而增加传输速度。但同时在发送时需要注意flush(),也就是让没有达到发送门槛的数据发送,否则如果后面没有数据会导致数据无法发送 Data相关是封装了byte的流,也就是可以接受和返回int等类型的流,无需再转成byte或者从byte换成各种类型(这样确实方便 ReaderWriter是在原来的基础上更加注重文本编码,同时处理的是字符而不是byte。其子类InputStreamReaderInputStreamReader将以编码类型为参数实例化 最后所有创建的类都要注意close()来关闭资源

下面是类的关系图

mermaid
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 抽象类 有方法如下

java
// 仅写入一个字节
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 同为抽象类 有方法如下

java
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()

缓冲流

BufferedInputStreamInputStream的一个子类,它会在内存中添加一个缓冲区,当从BufferedInputStream读取数据时,首先尝试从缓冲区中获取数据,当缓冲区中的数据被耗尽时,BufferedInputStream才会从底层数据源读取更多的数据填充缓冲区。这种方法减少了实际的I/O操作次数,从而提高了性能。 BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int bufferSize)

相应的,BufferedOutputStreamoutputStream的一个子类,写入时也会创建缓冲区,因此发送数据需要手动刷新输出流,即flush()

数据流

DataInputStream封装了FilterInputStream可以处理特定的类型 并且所有方法都被final修饰了,无法再被重写 构造函数public DataInputStream(InputStream in) 需要以输入流为参数 可以读取对应类型的函数

java
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相同

ReaderWriter

二者都是抽象类,作用是把流的byte转换为文本,与原来的DataxxStream不同点在于其子类处理的是字符而非byte,也更注重文本编码(上面的最多只有utf-8 相同的 读取文件时使用带有File的子类FileReader("input.txt")FileWriter("output.txt")使用文件路径作为参数

二者子类InputStreamReaderOutputStreamWriter将流作为参数,同时需要指定文本编码

java
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));
}

此外两个子类还有子类 BufferedReaderBufferedWriter 同样是缓冲功能 提高效率,同时BufferedReader可以使用readLine()读取一行

java
Reader reader = new BufferedReader(new FileReader("input.txt"));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
reader.close();

文章标题:java网络编程-流

文章作者:Blank

文章链接:https://blankxiao.github.io/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/%E6%B5%81reader%E5%92%8Cwriter[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。