跳到主要内容

Java IO流

介绍

在Java中,IO流(Input/Output Stream)是处理输入和输出的核心机制。无论是从文件读取数据,还是将数据写入文件,IO流都扮演着重要的角色。Java的IO流分为两大类:字节流字符流。字节流以字节为单位处理数据,而字符流则以字符为单位处理数据。

字节流 vs 字符流

  • 字节流:适用于处理二进制数据,如图片、音频、视频等。主要类包括 InputStreamOutputStream
  • 字符流:适用于处理文本数据,如读取或写入文本文件。主要类包括 ReaderWriter

字节流

InputStream 和 OutputStream

InputStream 是所有字节输入流的父类,而 OutputStream 是所有字节输出流的父类。以下是它们的基本用法:

java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

输入文件 input.txt 内容:

Hello, World!

输出文件 output.txt 内容:

Hello, World!
备注

try-with-resources 语句确保流在使用后自动关闭,避免了资源泄漏。

字符流

Reader 和 Writer

Reader 是所有字符输入流的父类,而 Writer 是所有字符输出流的父类。以下是它们的基本用法:

java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")) {
int data;
while ((data = fr.read()) != -1) {
fw.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

输入文件 input.txt 内容:

Hello, World!

输出文件 output.txt 内容:

Hello, World!
提示

字符流更适合处理文本数据,因为它们会自动处理字符编码问题。

缓冲流

为了提高IO操作的效率,Java提供了缓冲流(Buffered Stream)。缓冲流通过在内存中缓存数据,减少了对底层数据源的直接访问次数。

BufferedInputStream 和 BufferedOutputStream

java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedStreamExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
int data;
while ((data = bis.read()) != -1) {
bos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

BufferedReader 和 BufferedWriter

java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedCharStreamExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
警告

使用缓冲流时,记得在写入完成后调用 flush() 方法,以确保所有数据都被写入目标文件。

实际应用场景

文件复制

以下是一个使用缓冲流复制文件的示例:

java
import java.io.*;

public class FileCopyExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("destination.txt"))) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

日志记录

以下是一个使用字符流记录日志的示例:

java
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;

public class LoggingExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("log.txt", true)) {
String logEntry = LocalDateTime.now() + " - Application started\n";
fw.write(logEntry);
} catch (IOException e) {
e.printStackTrace();
}
}
}

总结

Java的IO流提供了强大的工具来处理数据的输入和输出。通过字节流和字符流,你可以轻松地处理各种类型的数据。缓冲流则进一步提高了IO操作的效率。在实际应用中,IO流被广泛用于文件操作、日志记录等场景。

附加资源

练习

  1. 编写一个程序,使用缓冲流将一个大型文件复制到另一个位置。
  2. 修改日志记录示例,使其能够记录不同级别的日志信息(如INFO、WARNING、ERROR)。
  3. 尝试使用 DataInputStreamDataOutputStream 来读写基本数据类型。