IO

IO

所有输入流的基类:InputStream / Reader 所有输出流的基类:OutputStream / Writer

字节流

InputStream常用方法:read(), skip(), available(), close()

  • FileInputStream

  • DataInputStream : 用于读取指定类型数据,不能单独使用,必须结合其它流,比如 FileInputStream 。

  • ObjectInputStream : 从输入流中读取 Java 对象(反序列化)

  • BufferedInputStream

OutputStream常用方法:write(), flush(), close()

  • FileOutputStream

  • DataOutputStream

  • ObjectOutputStream: 将对象写入到输出流 (序列化)。

  • BufferedOutputStream

常用字符编码所占字节数?utf8 :英文占 1 字节,中文占 3 字节,unicode:任何字符都占 2 个字节,gbk:英文占 1 字节,中文占 2 字节。

字符流

Reader(字符输入流)

Reader 用于读取文本, InputStream 用于读取原始字节。

Reader 常用方法:read(), skip(), close()

字节流转换为字符流的桥梁:InputStreamReader

// 字节流转换为字符流的桥梁
public class InputStreamReader extends Reader {
}
// 用于读取字符文件
public class FileReader extends InputStreamReader {
}

Writer(字符输出流)

Writer用于将数据(字符信息)写入到目的地(通常是文件)
Writer 常用方法:write(), append(), flush(), close()

字符流转换为字节流的桥梁:OutputStreamWriter

// 字符流转换为字节流的桥梁
public class OutputStreamWriter extends Writer {
}
// 用于写入字符到文件
public class FileWriter extends OutputStreamWriter {
}

字节缓冲流

 BufferedInputStream

 BufferedOutputStream

字节缓冲流会先将读取到的字节存放在缓存区,大幅减少 IO 次数,提高读取效率。

字符缓冲流

BufferedReader

BufferedWriter

打印流

PrintStream

PrintWriter

IO模型

BIO (Blocking I/O)同步阻塞IO模型

应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。

NIO (Non-blocking/New I/O)

Java NIO 核心知识总结 | JavaGuide

同步非阻塞 IO 模型:应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。(通过轮询操作,避免了一直阻塞。)

  • NIO 面向块,I/O 面向流

  • 非阻塞、面向缓冲、基于通道的 I/O,可以使用少量的线程来处理多个连接,大大提高了 I/O 效率和并发。

NIO核心组件:

  • Buffer(缓冲区)

  • Channel(通道):双向的、可读可写的数据传输通道

  • Selector(选择器)

NIO零拷贝:零拷贝是指计算机执行 IO 操作时,CPU 不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及 CPU 的拷贝时间。

AIO (Asynchronous I/O)

异步 IO 模型:异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

热门相关:超级英雄   帝少夜宠:小甜妻,乖!   隐婚365天:江少,高调宠!   至尊医道   亡国公主穿成王府寡妇:二嫁王妃