在Java中,文件读写操作是常见的任务。Java提供了多种方式来实现文件的读取和写入操作。本指南将详细介绍如何使用Java进行文件的读写操作,包括使用FileInputStream
/FileOutputStream
、BufferedReader
/BufferedWriter
、Files
类等。
1. 使用 FileInputStream
和 FileOutputStream
进行字节流读写
1.1 文件读取 (FileInputStream
)
FileInputStream
是用于从文件中读取字节流的类。它适用于读取二进制文件(如图片、音频等)或文本文件。
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt")) {
int content;
// 每次读取一个字节,直到文件末尾
while ((content = fis.read()) != -1) {
System.out.print((char) content); // 将字节转换为字符并打印
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.2 文件写入 (FileOutputStream
)
FileOutputStream
是用于向文件中写入字节流的类。它适用于写入二进制文件或文本文件。
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
String data = "Hello, World!";
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
// 将字符串转换为字节数组并写入文件
byte[] bytes = data.getBytes();
fos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 使用 BufferedReader
和 BufferedWriter
进行字符流读写
2.1 文件读取 (BufferedReader
)
BufferedReader
是用于高效读取字符流的类,通常与 FileReader
结合使用。它适用于读取文本文件。
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("input.txt"))) {
String line;
// 每次读取一行,直到文件末尾
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.2 文件写入 (BufferedWriter
)
BufferedWriter
是用于高效写入字符流的类,通常与 FileWriter
结合使用。它适用于写入文本文件。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
String data = "Hello, World!";
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
// 写入字符串到文件
bw.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 使用 Files
类进行文件读写
Files
类是 Java 7 引入的一个工具类,提供了许多静态方法来简化文件操作。它可以用于读取整个文件的内容或将内容写入文件。
3.1 文件读取 (Files.readAllLines
)
Files.readAllLines
方法可以一次性读取文件的所有行,并将其存储在一个 List<String>
中。
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class FilesReadExample {
public static void main(String[] args) {
try {
// 读取文件的所有行
List<String> lines = Files.readAllLines(Paths.get("input.txt"));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.2 文件写入 (Files.write
)
Files.write
方法可以将一组字符串写入文件。
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class FilesWriteExample {
public static void main(String[] args) {
List<String> lines = Arrays.asList("Hello", "World");
try {
// 将字符串列表写入文件
Files.write(Paths.get("output.txt"), lines);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 使用 Scanner
类进行文件读取
Scanner
类不仅可以用于从控制台读取输入,还可以用于从文件中读取数据。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("input.txt"))) {
// 每次读取一行,直到文件末尾
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
5. 使用 PrintWriter
进行文件写入
PrintWriter
是一个非常方便的类,允许你以类似于 System.out.println
的方式写入文件。
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;
public class PrintWriterExample {
public static void main(String[] args) {
try (PrintWriter pw = new PrintWriter(new FileWriter("output.txt"))) {
// 使用 println 方法写入文件
pw.println("Hello, World!");
pw.println("This is a test.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
6. 处理异常
在进行文件读写操作时,可能会遇到各种异常,例如文件不存在、权限不足等。因此,必须正确处理这些异常。通常使用 try-catch
块来捕获和处理异常。
try {
// 文件读写操作
} catch (IOException e) {
e.printStackTrace();
}
7. 使用 try-with-resources
自动关闭资源
Java 7 引入了 try-with-resources
语法,可以在 try
语句结束后自动关闭资源,避免手动调用 close()
方法。
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
// 文件读取操作
} catch (IOException e) {
e.printStackTrace();
}
总结
-
字节流:使用
FileInputStream
和FileOutputStream
进行字节级别的读写操作,适用于二进制文件。 -
字符流:使用
BufferedReader
和BufferedWriter
进行字符级别的读写操作,适用于文本文件。 -
Files 类:使用
Files.readAllLines
和Files.write
可以简化文件的读写操作。 -
Scanner 和 PrintWriter:
Scanner
适合逐行读取文件,PrintWriter
适合格式化输出到文件。 -
异常处理:在文件操作中要始终处理可能的
IOException
。 -
资源管理:使用
try-with-resources
自动管理资源,确保文件流在使用后被正确关闭。
通过以上方法,你可以根据具体需求选择合适的文件读写方式。