文章目录
一、引言
在Java编程中,IO(输入/输出)操作是一个非常重要的概念,它使得程序能够与外部世界进行数据交互。Java的IO体系设计精妙,主要分为字节流和字符流两大体系,它们分别用于处理不同类型的数据传输。
二、IO流的基本概念
Java的IO流设计基于装饰器模式,通过层层包装来扩展功能。所有的流都分为两个方向:输入流和输出流。输入流用于从外部读取数据到程序中,输出流用于从程序写出数据到外部。字节流以字节为单位传输数据,而字符流以字符为单位传输数据,这使得字符流更适合处理文本内容。
三、字节流体系
字节流是最基本的IO流,它直接处理字节数据。InputStream和OutputStream是所有字节流的抽象基类。
字节流适合处理二进制文件,如图片、音频、视频等。
public class ByteStreamExample {
public void copyFile(String source, String target) {
try (FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(target)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
fos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void readBinaryFile() {
try (BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("image.jpg"))) {
byte[] content = bis.readAllBytes();
// 处理二进制数据
processImageData(content);
} catch (IOException e) {
e.printStackTrace();
}
}
private void processImageData(byte[] data) {
// 处理图片数据的具体实现
}
}
四、字符流体系
字符流是Java为了更好地处理文本数据而设计的,它的基本单位是字符而不是字节。Reader和Writer是所有字符流的抽象基类。
字符流内部会进行字符编码的转换,因此更适合处理文本文件。
public class CharacterStreamExample {
public void textFileProcessing() {
try (BufferedReader reader = new BufferedReader(
new FileReader("input.txt", StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(
new FileWriter("output.txt", StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
// 处理文本行
String processed = processLine(line);
writer.write(processed);
writer.newLine();
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void characterStreamBuffering() {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in, StandardCharsets.UTF_8))) {
StringBuilder content = new StringBuilder();
int character;
while ((character = reader.read()