Java IO流
介绍
在Java中,IO流(Input/Output Stream)是处理输入和输出的核心机制。无论是从文件读取数据,还是将数据写入文件,IO流都扮演着重要的角色。Java的IO流分为两大类:字节流和字符流。字节流以字节为单位处理数据,而字符流则以字符为单位处理数据。
字节流 vs 字符流
- 字节流:适用于处理二进制数据,如图片、音频、视频等。主要类包括
InputStream
和OutputStream
。 - 字符流:适用于处理文本数据,如读取或写入文本文件。主要类包括
Reader
和Writer
。
字节流
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流被广泛用于文件操作、日志记录等场景。
附加资源
练习
- 编写一个程序,使用缓冲流将一个大型文件复制到另一个位置。
- 修改日志记录示例,使其能够记录不同级别的日志信息(如INFO、WARNING、ERROR)。
- 尝试使用
DataInputStream
和DataOutputStream
来读写基本数据类型。