六、IO
输入输出(I/O流)是Java中用于读写数据的机制,它是处理输入和输出的抽象概念。在Java中、所有的输入输出都被视为数据流,无论是从文件、网络、键盘还是其它设备。
Java的输入/输出(I/O)系统提供了一组用于读写数据的类和接口,这些类和接口被分为不同的层次,用于处理不同类型的I/O操作。
一、基本概念
1.流(Stream)
流是数据的顺序序列,它可以是输入流(用于读写数据)或输出流(用于写入数据)。流与数据源或数据目的地之间建立了连接,通过流可以实现对数据的读取和写入。
2.输入流(Input Stream)
用于从数据源(如文件、网络、键盘等)读取数据的流。输入流提供了一种逐字节读取数据的方式。
3.输出流(Output Stream)
用于向数据目的地(如文件、网络、屏幕等)写入数据的流。输出流提供了一种逐字节写入数据的方式。
二、分类
在Java中,输入输出流可以根据其操作对象的不同进行分类,主要分为字节流和字符流两种类型。
1.字节流
处理原始的字节数据。
- 字节流以字节为单位进行读写操作,适用于处理二进制数据或字节流形式的文本数据。
InputStream
和OutputStream
是字节流的抽象基类。- 常用子类:
FileInputStream
、FileOutputStream
:用于文件操作。ByteArrayInputStream
、ByteArrayOutputStream
:用于内存缓冲区操作。BufferedInputStream
、BufferedOutputStream
:提供缓冲机制,提高性能。
常用示例
public class ByteStreamExample {
/**
* 此处实现了从一个文件复制到另一个文件的功能,使用了字节流进行文件的读取和写入。
* 特别地,展示了如何处理文件输入/输出流,以及如何在读取到文件末尾时终止循环。
*/
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
String basePath = "io/src/main/resources/base/";
// System.out.println("Current working directory: " + System.getProperty("user.dir"));
try {
// 打开一个文件输入流,用于从指定的文件读取数据。
in = new FileInputStream(basePath + "ByteStreamExampleInput.txt");
// 打开一个文件输出流,用于将读取的数据写入到指定的文件。
out = new FileOutputStream(basePath + "ByteStreamExampleOutput.txt");
int data;
// 通过循环读取文件中的每个字节,直到文件末尾。
while ((data = in.read()) != -1) {
// 将读取到的字节写入到输出文件中。
out.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
// 注意:确保在操作完成后关闭流,即使发生异常也要关闭,在finally块中显式关闭流,养成好习惯。
finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
2.字符流(Character Stream)
处理字符数据(文本),适用于处理文本文件。
- 字符流以字符为单位进行读写操作,适用于处理文本数据。
- 字符流能够自动处理字符编码和解码的细节,提供了更方便的字符级别操作。
Reader
和Writer
是字符流的抽象基类。- 常用子类:
FileReader
、FileWriter
:用于文件操作。CharArrayReader
、CharArrayWriter
:用于内存缓冲区操作。BufferedReader
、BufferedWriter
:提供缓冲机制,提高性能。InputStreamReader
、OutputStreamWriter
:用于字节流和字符流的桥接。
常用示例
public class CharStreamExample {
/**
* 本方法实现了从一个文本文件读取数据,并将这些数据写入到另一个文本文件。
* 它使用了FileReader和FileWriter类来处理文件的读写操作。
*/
public static void main(String[] args) throws IOException {
String basePath = "io/src/main/resources/base/";
// 初始化FileReader和FileWriter对象,用于文件的读写。
FileReader reader = null;
FileWriter writer = null;
try {
// 创建FileReader对象,用于读取指定路径的文本文件。
reader = new FileReader(basePath + "CharStreamExampleInput.txt");
// 创建FileWriter对象,用于写入指定路径的文本文件。
writer = new FileWriter(basePath + "CharStreamExampleOutput.txt")