在Java中,I/O(输入/输出)流是进行数据传输的重要机制,用于从文件、网络或内存中读取数据(输入)或将数据写入存储设备(输出)。Java的I/O系统是基于流的概念,流可以简单理解为数据的源泉或终点。流分为字节流和字符流两种,分别用于处理二进制数据和文本数据。
一、Java中的流类型
-
字节流:以字节为单位进行输入输出,主要用于处理二进制文件,例如图片、音频和视频等。字节流的基类是
InputStream
和OutputStream
。InputStream
:所有字节输入流的超类。OutputStream
:所有字节输出流的超类。
-
字符流:以字符为单位进行输入输出,主要用于文本文件。字符流的基类是
Reader
和Writer
。Reader
:所有字符输入流的超类。Writer
:所有字符输出流的超类。
二、字节流的使用示例
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
String inputFilePath = "input.txt"; // 输入文件路径
String outputFilePath = "output.txt"; // 输出文件路径
// 使用字节流进行文件拷贝
try (FileInputStream fis = new FileInputStream(inputFilePath);
FileOutputStream fos = new FileOutputStream(outputFilePath)) {
byte[] buffer = new byte[1024]; // 创建一个缓冲区
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead); // 写入缓冲区中的数据
}
System.out.println("文件拷贝成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述示例中,FileInputStream
用于读取input.txt
文件,FileOutputStream
用于将数据写入output.txt
。通过循环读取文件内容并写入输出流,完成了文件的拷贝操作。
三、字符流的使用示例
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamExample {
public static void main(String[] args) {
String inputFilePath = "input.txt"; // 输入文件路径
String outputFilePath = "output.txt"; // 输出文件路径
// 使用字符流进行文件拷贝
try (BufferedReader reader = new BufferedReader(new FileReader(inputFilePath));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine(); // 写入换行符
}
System.out.println("文件拷贝成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个字符流的示例中,BufferedReader
和BufferedWriter
用于高效地读取和写入字符数据。通过readLine()
方法逐行读取并写入,适用于文本文件的处理。
四、总结
Java的I/O流提供了丰富的功能来处理数据的输入输出。字节流适合处理二进制数据,而字符流则适合文本数据。通过合理使用Java的I/O流,可以简化文件和数据的处理过程,提高程序的开发效率。此外,Java还提供了NIO(New I/O)包,进一步改善了I/O操作的性能和灵活性。掌握这些基本操作,对于日常开发是非常重要的技能。