Java 的 I/O 流
I/O 即 Input/Output,I/O 用来处理设备之间的数据传输,比如:从磁盘中读写文件、在网络中传输数据等。
在 Java 中,对于 I/O 的操作是以流(Stream)的方式进行的,在 java.io
包中提供了多种流的类和接口,用来操作各种类型的数据,并通过标准的方法输入(read)和输出(write)数据。
流的分类
抽象父类:InputStream
OutputStream
Reader
Writer
;
- 按照流的流向,分为:输入流和输出流;
- 按照流中操作的数据单位,分为:字节流(8 bit)和字符流(16 bit);
- 字节流:
InputStream
OutputStream
; - 字符流:
Reader
Writer
;
- 字节流:
- 按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为:节点流和处理流;
- 节点流:可以从或者向一个特定的节点读写数据的流,如:FileReader 类;
常见节点流:
- 文件流:
FileInputStream
FileReader
等以 File 开头的流;
- 文件流:
- 处理流:是对一个已存在流的封装,如:BufferedReader 类。处理流的构造方法总是要传入一个其他流对象作为参数,一个流对象经过处理流的包装,称为流的连接。注意:关闭流的时候要先关闭外层的流,再关闭内层的流(但是关闭外层的流时会自动关闭内层的流,所以只需要关闭外层的流);
常见的处理流:
- 缓冲流:
BufferedInputStream
BufferedReader
等以 Buffered 开头的流,增加缓冲功能,避免频繁读写硬盘,提高了数据传输效率,BufferedWriter
和BufferedOutputStream
提供了flush()
方法,作用是将缓冲区的数据刷新到基础流中,当缓冲区满了会自动刷新,我们不需要显式调用flush()
,除非需要立即用到当前缓冲区的数据; - 转换流:
InputStreamReader
--> 继承自 Reader,OutputStreamWriter
--> 继承自 Writer,实现字节流与字符流之间的转换;
InputStreamReader
:byte 转 char(解码);OutputStreamWriter
:char 转 byte(编码)。
- 数据流:
DataInputStream
DataOutputStream
,提供方法读写 Java 基础数据类型; - 打印流:
PrintStream
--> 继承自 FilterOutputStream --> 继承自 OutputStream;PrintWriter
继承自 Writer;这两个类提供了带两个参数的构造方法,可以实现自动flush()
;注意:打印流的 print 方法不会抛出异常;
public PrintStream(OutputStream out, boolean autoFlush); public PrintWriter(Writer out, boolean autoFlush);
- 缓冲流:
- 节点流:可以从或者向一个特定的节点读写数据的流,如:FileReader 类;
java.nio.file
包,提供了 Path, Paths, Files
等类和接口,增强了对文件处理的支持。(注意:Paths
类已经不推荐使用,在未来可能会被废弃)关于
Path
接口和 Files
类的一些常用方法:Path
// 写文件:获取输出流,用来写数据进文件里
// 注意,Path.of 创建的 Path 对象只是对一个可能存在的文件的引用,不保证存在这个文件,如要确定,应调用 java.nio.file.Files.exists()方法
OutputStream out = Files.newOutputStream(Path.of("E:/szu.html"));
Files
// 写文件
Files.write(Path path, byte[] file);
// 读文件
Files.readAllBytes(Path path);
if (Files.isDirectory(Path.of(""))) {// 打印当前目录下的所有文件, forEach 里的 path 类型是 java.nio.file.Path
Files.list(Path.of("")).forEach(path -> System.out.println(path));
// 打印指定后缀的所有文件
Files.list(Path.of(""))
.filter(path -> path.toString().endswith(".pdf"))
.forEach(System.out::println);
}
【面试官(请谈谈 Java 中的 I/O 流)】参考资料:
- 尚硅谷 Java 入门
- Java 节点流和处理流的区别
推荐阅读
- spring|eureka使用总结
- Java实战|Java SPI 和 API,傻傻分不清()
- SpringBoot|SpringBoot+Vue从零开始做网站8-全局异常处理和使用mybatis-plus分页插件
- #|Spring Framework
- 笔记|xjar加密jar包springboot(实用,方便,包你学会)
- vue.js|Java毕业设计(基于SpringBoot+Vue前后分离的社区健康疫情防控系统)
- MySQL|IDEA连接mysql保姆级教学
- mysql|动态sql的标签语言
- javaWeb|Javaweb菜单信息管理的一级菜单和二级菜单显示