概述
IO(输入/输出)
Java IO通过 java.io 包下的类和接口来实现,主要包括输入、输出两种IO流。
Java IO流使用了一种装饰器设计模式,它将IO流分为了底层节点流
和上层处理流
;其中节点流用于和底层的物理存储节点直接关联—不同的物理节点获取节点流的方式可能存在一定的差异,但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同的物理存储节点的资源。
Java 7 在 java.nio 及其子包下提供了一系列全新的API,对原有的IO进行升级,也称为 NIO2。
流的分类
- 输入流和输出流
输入流:主要由 InputStream 和 Reader 作为基类
输出流:主要由 OutputStream 和 Writer 作为基类。 - 字节流和字符流:用法几乎完全一致,只是处理的数据单位不一样。
字节流:操作的数据单位是8位的字节
; 主要是以 InputStream 和 OutputStream 作为基类;
字符流:操作的数据单位是16位的字符
;主要是以 Reader 和 Writer 作为基类; - 节点流 和 处理流: 按照流的角色来划分。
节点流:可以向一个特定I/O设备(如磁盘、网络)读/写数据的流,也被称为低级流。
处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现读/写功能,也被称为高级流。
典型的处理流有:PrintStream,可以用来包装FileOutputStream,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。
好处:只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应地发生变化。
流的概念模型
Java把所有设备里的有序数据抽象成流模型,简化了输入/输出处理。
主要是理解下面的输入输出流体系。
重点注意:Java处理流模型
,它体现了Java输入/输出流设计的灵活性。
处理流的功能主要体现在以下2个方面:
- 性能的提高:主要以增加缓存的方式来提高输入/输出的效率
- 操作的便捷性:处理流可能提供了一系列便捷的方法来一次输入/输出大批量的内容,
输入输出流体系
注意,下表中,只总结了位于 java.io包下的流;
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataInputStream | DataOutputStream |
说明:
粗体字标出的类代表节点流,必须直接与指定的物理节点关联。
斜体字标出的类代表抽象基类,无法直接创建实例。
通常来说,字节流的功能比字符流的功能大,因为计算机里所有的数据都是二进制的。
如果输入/输出的是内容是文本文件,则考虑使用字符流;
如果输入/输出的是内容是二进制文件,则考虑使用字节流。
上表中的管道流
,它们都是用于实现线程之间通信功能的;
上表中的缓冲流
,增加了缓冲功能,可以提高输入、输出的效率,但是需要使用flush()才可以将缓冲区的内容写入实际的物理节点。
转换流
InputStreamReader:将字节输入流转为字符输入流。
OutputStreamWriter:将字节输出流转为字符输出流。
文件类
File
File类是java.io包下代表与平台无关的文件和目录
。
如果希望在程序中操作文件和目录,都可以通过File类来完成。但是不能访问文件内容本身。
删除文件
File类的delete():
删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除。若成功删除返回true,否则返回false
File类的deleteOnExit():
当虚拟机终止时,删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除,无返回值。
delete是立即执行删除,而deleteOnExit是程序退出虚拟机时才会删除。
访问文件和目录
可以查看源码;
里面提供了很多方法;
文件过滤器
FilenamFilter接口。支持Lambda表达式。
RandomAccessFile
BIO、NIO、AIO 有什么区别?
- BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
- NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
- AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155722.html