Java中的IO流(Input/Output streams)是Java程序用来处理数据输入和输出的核心工具集。IO流抽象了数据流动的概念,允许Java程序与外部世界进行数据交换,无论是从文件、网络、键盘输入还是向屏幕、文件或网络发送数据。Java IO流按照处理数据的不同类型和方向,可以分为以下几个关键类别:
- 字节流(Byte Streams):
java.io.InputStream
和java.io.OutputStream
是所有字节流的顶层抽象接口,分别表示字节输入流和字节输出流。这类流主要用于处理原始的二进制数据,如图片、音频、视频等非文本文件。- 具体的实现类包括
FileInputStream
和FileOutputStream
用于读写文件,ByteArrayInputStream
和ByteArrayOutputStream
用于内存中的字节数组操作,还有BufferedInputStream
和BufferedOutputStream
等缓冲流,提供了数据读写的缓冲功能,提升效率。
- 字符流(Character Streams):
java.io.Reader
和java.io.Writer
是字符流的顶级接口,用于处理字符数据,即文本数据。- 具体实现类如
FileReader
和FileWriter
用于读写文本文件,BufferedReader
和BufferedWriter
则提供了缓存功能,还有CharArrayReader
和CharArrayWriter
用于内存中的字符数组操作。
- 节点流与处理流:
- 节点流 直接与数据源或目的地相连,例如读取硬盘文件或写入网络套接字的数据流。
- 处理流 或 包装流 并不直接连接到数据源或目的地,而是在已有节点流的基础上添加额外功能,如过滤、格式转换、缓冲等。例如
DataInputStream
和DataOutputStream
用于数据的序列化和反序列化,PrintStream
提供了格式化的输出能力,GZIPOutputStream
和GZIPInputStream
则实现了数据的压缩和解压。
- 高级IO流(NIO):
- 自Java 1.4以来引入了New IO(NIO),提供了新的通道(Channel)和缓冲区(Buffer)API,允许非阻塞的、面向缓冲的IO操作。例如
java.nio.channels.FileChannel
可以用于高性能的文件读写操作。
- 自Java 1.4以来引入了New IO(NIO),提供了新的通道(Channel)和缓冲区(Buffer)API,允许非阻塞的、面向缓冲的IO操作。例如
Java提供了大量的类来支持IO操作,下表给大家介绍了其中比较常用的一些类。其中,黑色字体的是抽象基类,其他所有的类都继承自它们。红色字体的是节点流,蓝色字体的是处理流。
根据命名很容易理解各个流的作用:
-
以File开头的文件流用于访问文件;
-
以ByteArray/CharArray开头的流用于访问内存中的数组;
-
以Piped开头的管道流用于访问管道,实现进程之间的通信;
-
以String开头的流用于访问内存中的字符串;
-
以Buffered开头的缓冲流,用于在读写数据时对数据进行缓存,以减少IO次数;
-
InputStreamReader、InputStreamWriter是转换流,用于将字节流转换为字符流;
-
以Object开头的流是对象流,用于实现对象的序列化;
-
以Print开头的流是打印流,用于简化打印操作;
-
以Pushback开头的流是推回输入流,用于将已读入的数据推回到缓冲区,从而实现再次读取;
-
以Data开头的流是特殊流,用于读写Java基本类型的数据。
注意:
Java IO流的设计遵循了装饰器模式,允许我们通过组合不同类型的流来实现复杂的数据处理任务。在使用流的时候,需要关注资源的有效管理和异常处理,通常会使用try-with-resources语句来确保流在使用完毕后会被正确关闭。