Java 中 IO 流的种类
按照流的流向划分,可以划分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分,可以划分为节点流和处理流。
其实 Java IO 流共涉及 40 多个类,这 40 多个类看起来杂乱无章,但其实是由一定的规律可循的,而且彼此之间存在非常紧密的联系, Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。
- InputStream:字节输入流,所有的输入流的基类
- Reader:字符输入流,所有的输入流的基类
- OutputStream/Writer::字节输出流,所有的输出流的基类
- Writer:字符输出流,所有的输出流的基类
按照操作方式划分结构图如下图所示:
按照操作对象分类结构图如下图所示:
BIO、NIO、AIO 的区别
BIO:Block IO,同步阻塞式 IO,就是平常使用的传统的 IO,特点是模式简单,使用方便,但是并发处理能力低。数据的读取和写入必须阻塞在同一个线程内等待其完成。在活动连接数不是特别高(单机小于 1000)的情况下,这种模式是比较不错的,可以让每一个连接专注于自己的 IO,并且编程模式简单,也不用过多考虑系统的负载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是当面对十万甚至百万级连接的时候,传统模式的 BIO 是无法处理的。因此就需要一种更高效的 IO 模型来应对并处理更高的并发量。
NIO:Non IO,也称 New IO,同步非阻塞 IO,是传统 IO 的升级版,客户端和服务端通过 Channel(渠道)通讯,实现了多路复用。在 java 1.4 中引入了 NIO 框架,对应的 java.nio 包,提供了 Channel、Selector、Buffer 等抽象概念。N 除了有 New 的意思之外,还有 Non-Blocking 的意思在里边。它支持面向缓冲的、基于通道的 IO 操作方法。NIO 提供了与传统 BIO 模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统的 BIO 一样,比较简单,但是性能和可靠性都不好;非阻塞模式则正好相反。对于低负载、低并发的应用程序,可以使用同步阻塞 IO(即 BIO)来提升开发速率和更好的维护性;对于高负载、高并发的网络应用,应该使用 NIO 的非阻塞模式进行开发。
AIO:Asynchronous IO,异步非阻塞 IO。是 NIO 的升级版,也称 NIO2。在 Java 7 中引入的,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会阻塞到那里,当后台处理完成之后,操作系统会通知相应的线程进行后续的操作。
Files 的常用方法
Files.exists():检查文件路径是否存在
Files.createFile():创建文件
Files.createDirectory():创建文件夹
Files.delete():删除文件或目录
Files.copy():复制文件
Files.move():移动文件
Files.size():查看文件的个数
Files.read():读取文件
Files.write():写入文件