一、概述
I/O(Input/Output)流是用于数据输入和输出的机制。它是计算机程序与外部世界(文件、网络连接、设备等)进行交互的一种方式。
在计算机中,数据通常以流的形式进行传输。I/O 流提供了一种流式传输数据的方式,程序可以从流中读取数据(输入)或向流中写入数据(输出)。I/O 流可以连接到不同的数据源和目标,如文件、网络套接字、内存、控制台等。
I/O 流提供了一组类和接口用于实现不同的输入和输出需求。这些类包括处理文件的 FileInputStream、FileOutputStream、FileReader、FileWriter,处理缓冲的 BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter,处理对象的 ObjectInputStream、ObjectOutputStream 等。
使用 I/O 流时,通常需要进行打开、读取/写入、关闭等操作。为了确保资源正确关闭,可以使用 try-with-resources 语句来自动管理流的生命周期。
二、IO流分类
1.按照流的方向分类:
- 输入流(Input Streams):输入流从外部读取数据并将其提供给程序。它们是数据的来源,通常用于读取文件、网络套接字、内存等。在Java中,输入流的基本抽象类是InputStream和Reader。常用的输入流类包括FileInputStream、FileReader、ByteArrayInputStream、BufferedInputStream等。
- 输出流(Output Streams):输出流从程序中获取数据并将其写入到外部。它们是数据的目标,通常用于写入文件、网络套接字、内存等。在Java中,输出流的基本抽象类是OutputStream和Writer。常用的输出流类包括FileOutputStream、FileWriter、ByteArrayOutputStream、BufferedOutputStream等。
输入流和输出流在Java I/O中是互相独立的,不会互相干扰。
2.按照操作文件类型分类:
- 字节流(Byte Streams):字节流用于操作二进制文件,适合处理图像、音频、视频等非文本文件。常用的字节流类包括FileInputStream、FileOutputStream、ByteArrayInputStream、ByteArrayOutputStream等。
- 字符流(Character Streams):字符流用于操作纯文本文件,能够正确地处理字符编码,适合处理包含文本内容的文件。常用的字符流类包括FileReader、FileWriter、BufferedReader、BufferedWriter等。
三、IO流体系
Java I/O(Input/Output)流体系是Java标准库中用于读取和写入数据的一组类和接口。I/O流可以分为字节流和字符流两类,其中字节流用于读取二进制数据,字符流则用于读取文本数据。
Java I/O流体系主要包括以下四个抽象类:
-
InputStream与OutputStream:InputStream是所有字节输入流的基类,OutputStream是所有字节输出流的基类,它们都定义了读取或写入单个字节到字节数组的方法。
-
Reader与Writer:Reader是所有字符输入流的基类,Writer是所有字符输出流的基类,它们都定义了读取或写入单个字符或字符数组的方法。
除此之外,Java I/O还涉及到一些常用的实现类和接口,比如File、RandomAccessFile、ByteArrayInputStream、ByteArrayOutputStream、BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter等。
常见的具体的实现类:
1.InputStream(字节输入流):
- FileInputStream:从文件中读取字节数据的输入流。
- ByteArrayInputStream:从字节数组中读取字节数据的输入流。
- PipedInputStream:与PipedOutputStream配合使用,在多线程之间进行管道通信。
2.OutputStream(字节输出流):
- FileOutputStream:将字节数据写入文件的输出流。
- ByteArrayOutputStream:将字节数据写入字节数组的输出流。
- PipedOutputStream:与PipedInputStream配合使用,在多线程之间进行管道通信。
3.Reader(字符输入流):
- FileReader:从文件中读取字符数据的输入流。
- CharArrayReader:从字符数组中读取字符数据的输入流。
- InputStreamReader:将字节流转换为字符流的输入流,支持指定字符编码。
4.Writer(字符输出流):
- FileWriter:将字符数据写入文件的输出流。
- CharArrayWriter:将字符数据写入字符数组的输出流。
- OutputStreamWriter:将字符流转换为字节流的输出流,支持指定字符编码。