Appearance
17.2 文件读写
文件读写的概念
文件读写是 Java IO 操作中的重要部分,它允许程序与文件系统进行交互,实现数据的持久化存储和读取。
文件字节流
FileInputStream
FileInputStream 用于从文件中读取字节数据。
构造方法
java
// 通过文件路径创建
FileInputStream fis = new FileInputStream("example.txt");
// 通过 File 对象创建
File file = new File("example.txt");
FileInputStream fis = new FileInputStream(file);常用方法
read():读取一个字节,返回字节值(0-255),如果到达文件末尾返回 -1read(byte[] b):读取多个字节到字节数组,返回实际读取的字节数read(byte[] b, int off, int len):读取指定长度的字节到字节数组的指定位置close():关闭流
示例:使用 FileInputStream 读取文件
java
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, bytesRead));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}FileOutputStream
FileOutputStream 用于向文件中写入字节数据。
构造方法
java
// 通过文件路径创建,覆盖现有文件
FileOutputStream fos = new FileOutputStream("example.txt");
// 通过文件路径创建,追加到现有文件
FileOutputStream fos = new FileOutputStream("example.txt", true);
// 通过 File 对象创建
File file = new File("example.txt");
FileOutputStream fos = new FileOutputStream(file);常用方法
write(int b):写入一个字节write(byte[] b):写入字节数组write(byte[] b, int off, int len):写入字节数组的指定部分flush():刷新流,将缓冲区中的数据写入文件close():关闭流
示例:使用 FileOutputStream 写入文件
java
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("example.txt")) {
String content = "Hello, FileOutputStream!";
fos.write(content.getBytes());
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}文件字符流
FileReader
FileReader 用于从文件中读取字符数据。
构造方法
java
// 通过文件路径创建
FileReader fr = new FileReader("example.txt");
// 通过 File 对象创建
File file = new File("example.txt");
FileReader fr = new FileReader(file);常用方法
read():读取一个字符,返回字符值(0-65535),如果到达文件末尾返回 -1read(char[] cbuf):读取多个字符到字符数组,返回实际读取的字符数read(char[] cbuf, int off, int len):读取指定长度的字符到字符数组的指定位置close():关闭流
示例:使用 FileReader 读取文件
java
import java.io.FileReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("example.txt")) {
char[] buffer = new char[1024];
int charsRead;
while ((charsRead = fr.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, charsRead));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}FileWriter
FileWriter 用于向文件中写入字符数据。
构造方法
java
// 通过文件路径创建,覆盖现有文件
FileWriter fw = new FileWriter("example.txt");
// 通过文件路径创建,追加到现有文件
FileWriter fw = new FileWriter("example.txt", true);
// 通过 File 对象创建
File file = new File("example.txt");
FileWriter fw = new FileWriter(file);常用方法
write(int c):写入一个字符write(char[] cbuf):写入字符数组write(char[] cbuf, int off, int len):写入字符数组的指定部分write(String str):写入字符串write(String str, int off, int len):写入字符串的指定部分flush():刷新流,将缓冲区中的数据写入文件close():关闭流
示例:使用 FileWriter 写入文件
java
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("example.txt")) {
String content = "Hello, FileWriter!";
fw.write(content);
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}带缓冲区的流
BufferedReader
BufferedReader 是一个处理流,它包装了一个字符输入流,提供了缓冲功能,提高读取效率。
构造方法
java
// 包装 FileReader
BufferedReader br = new BufferedReader(new FileReader("example.txt"));常用方法
read():读取一个字符read(char[] cbuf, int off, int len):读取多个字符到字符数组readLine():读取一行文本close():关闭流
示例:使用 BufferedReader 读取文件
java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}BufferedWriter
BufferedWriter 是一个处理流,它包装了一个字符输出流,提供了缓冲功能,提高写入效率。
构造方法
java
// 包装 FileWriter
BufferedWriter bw = new BufferedWriter(new FileWriter("example.txt"));常用方法
write(int c):写入一个字符write(char[] cbuf, int off, int len):写入字符数组的指定部分write(String s, int off, int len):写入字符串的指定部分newLine():写入一个换行符flush():刷新流close():关闭流
示例:使用 BufferedWriter 写入文件
java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("example.txt"))) {
bw.write("Hello, BufferedWriter!");
bw.newLine();
bw.write("This is a new line.");
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}示例:文件复制
使用字节流复制文件
java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyExample {
public static void main(String[] args) {
String sourceFile = "source.txt";
String targetFile = "target.txt";
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(targetFile)) {
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();
}
}
}使用字符流复制文本文件
java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TextFileCopyExample {
public static void main(String[] args) {
String sourceFile = "source.txt";
String targetFile = "target.txt";
try (BufferedReader br = new BufferedReader(new FileReader(sourceFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(targetFile))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
System.out.println("文本文件复制成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}常见问题
1. 文件不存在
症状:打开文件时抛出 FileNotFoundException
解决方案:确保文件路径正确,或者在写入文件时,FileOutputStream 会自动创建不存在的文件
2. 权限不足
症状:打开文件时抛出 SecurityException 或 AccessDeniedException
解决方案:确保程序有足够的权限访问文件
3. 流未关闭
症状:资源泄漏,可能导致文件被锁定
解决方案:使用 try-with-resources 语句自动关闭流,或在 finally 块中手动关闭流
4. 编码问题
症状:读取文本文件时出现乱码
解决方案:使用 InputStreamReader/OutputStreamWriter 并指定正确的编码
最佳实践
使用 try-with-resources:自动关闭流,避免资源泄漏
使用缓冲流:提高读写效率
指定编码:处理文本文件时,指定正确的编码
错误处理:捕获并处理 IOException
文件路径:使用相对路径时,注意当前工作目录
异常处理:对可能的异常进行适当的处理
总结
文件读写是 Java IO 操作的重要组成部分:
字节流:
- FileInputStream:从文件读取字节
- FileOutputStream:向文件写入字节
- 适用于所有类型的文件
字符流:
- FileReader:从文件读取字符
- FileWriter:向文件写入字符
- 适用于文本文件
缓冲流:
- BufferedReader:带缓冲区的字符输入流
- BufferedWriter:带缓冲区的字符输出流
- 提高读写效率
文件复制:
- 使用字节流复制任意类型的文件
- 使用字符流复制文本文件
通过合理使用这些流类,可以实现各种文件读写操作,满足不同场景的需求。
