本文目录导读:

我来详细介绍Java文件流的操作方法,包含多个实际案例。
基本文件读写操作
字节流复制文件
import java.io.*;
public class FileStreamDemo {
// 使用字节流复制文件
public static void copyFileByByte(String sourcePath, String destPath) {
try (FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(destPath)) {
byte[] buffer = new byte[1024]; // 1KB缓冲区
int length;
while ((length = fis.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
System.out.println("文件复制成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
copyFileByByte("input.txt", "output.txt");
}
}
字符流读写文件
public class CharStreamDemo {
// 使用字符流读取文件
public static void readFile(String filePath) {
try (FileReader reader = new FileReader(filePath)) {
int character;
StringBuilder content = new StringBuilder();
while ((character = reader.read()) != -1) {
content.append((char) character);
}
System.out.println("文件内容:\n" + content.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
// 使用BufferedReader高效读取
public static void readFileEfficiently(String filePath) {
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 使用BufferedWriter写入文件
public static void writeFile(String filePath, String content) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
writer.write(content);
writer.newLine();
writer.write("这是第二行内容");
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象序列化
保存和读取对象
import java.io.*;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String password; // transient字段不会被序列化
public Person(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + ", password='" + password + "'}";
}
}
public class ObjectStreamDemo {
// 序列化对象到文件
public static void serializeObject(String filePath) {
Person person = new Person("张三", 25, "123456");
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) {
oos.writeObject(person);
System.out.println("对象序列化成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
// 从文件反序列化对象
public static void deserializeObject(String filePath) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) {
Person person = (Person) ois.readObject();
System.out.println("反序列化的对象:" + person);
// 注意:password为null,因为使用了transient关键字
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
serializeObject("person.dat");
deserializeObject("person.dat");
}
}
随机访问文件
public class RandomAccessFileDemo {
// 使用RandomAccessFile随机读写
public static void randomAccessFileDemo(String filePath) {
try (RandomAccessFile raf = new RandomAccessFile(filePath, "rw")) {
// 写入数据
raf.writeInt(100);
raf.writeUTF("Hello World");
raf.writeDouble(99.99);
// 定位到文件开头
raf.seek(0);
// 读取数据
System.out.println("整数:" + raf.readInt());
System.out.println("字符串:" + raf.readUTF());
System.out.println("双精度:" + raf.readDouble());
// 查看当前位置
System.out.println("当前位置:" + raf.getFilePointer());
System.out.println("文件长度:" + raf.length());
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件属性操作
import java.nio.file.*;
import java.nio.file.attribute.*;
public class FileAttributesDemo {
// 获取文件属性
public static void getFileAttributes(String filePath) {
Path path = Paths.get(filePath);
try {
// 基本属性
System.out.println("文件名: " + path.getFileName());
System.out.println("绝对路径: " + path.toAbsolutePath());
System.out.println("父目录: " + path.getParent());
// 文件状态
System.out.println("是否存在: " + Files.exists(path));
System.out.println("是文件: " + Files.isRegularFile(path));
System.out.println("是目录: " + Files.isDirectory(path));
// 文件属性
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("创建时间: " + attrs.creationTime());
System.out.println("最后修改时间: " + attrs.lastModifiedTime());
System.out.println("文件大小: " + attrs.size() + " bytes");
} catch (IOException e) {
e.printStackTrace();
}
}
}
目录遍历与文件过滤
public class DirectoryDemo {
// 遍历目录下的所有文件
public static void listDirectory(String directoryPath) {
File dir = new File(directoryPath);
if (!dir.exists() || !dir.isDirectory()) {
System.out.println("目录不存在");
return;
}
// 列出所有文件和目录
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
String type = file.isDirectory() ? "目录" : "文件";
System.out.println(type + ": " + file.getName() +
" (大小: " + file.length() + " bytes)");
}
}
}
// 递归遍历目录
public static void traverseDirectory(File dir, String prefix) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println(prefix + "[目录] " + file.getName());
traverseDirectory(file, prefix + " ");
} else {
System.out.println(prefix + "[文件] " + file.getName());
}
}
}
}
// 文件过滤器示例
public static void filterFiles(String directoryPath, String extension) {
File dir = new File(directoryPath);
// 使用FilenameFilter过滤特定类型的文件
File[] textFiles = dir.listFiles((dir1, name) -> name.endsWith(extension));
if (textFiles != null) {
System.out.println("所有" + extension + "文件:");
for (File file : textFiles) {
System.out.println(file.getName());
}
}
}
}
实用工具类
public class FileUtils {
// 复制文件(使用NIO)
public static void copyFileNIO(String source, String target) {
try {
Files.copy(Paths.get(source), Paths.get(target),
StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件复制成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
// 移动文件
public static void moveFile(String source, String target) {
try {
Files.move(Paths.get(source), Paths.get(target),
StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件移动成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
// 删除文件
public static void deleteFile(String filePath) {
try {
Files.deleteIfExists(Paths.get(filePath));
System.out.println("文件删除成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取文件扩展名
public static String getExtension(String fileName) {
int dotIndex = fileName.lastIndexOf('.');
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}
}
使用示例
public class Main {
public static void main(String[] args) {
// 1. 字节流复制文件
FileStreamDemo.copyFileByByte("source.txt", "dest.txt");
// 2. 字符流读写
CharStreamDemo.writeFile("test.txt", "Hello World!");
CharStreamDemo.readFile("test.txt");
// 3. 对象序列化
ObjectStreamDemo.serializeObject("person.ser");
ObjectStreamDemo.deserializeObject("person.ser");
// 4. 文件属性
FileAttributesDemo.getFileAttributes("test.txt");
// 5. 目录操作
DirectoryDemo.listDirectory(".");
DirectoryDemo.filterFiles(".", ".txt");
// 6. 实用方法
FileUtils.copyFileNIO("test.txt", "test_copy.txt");
}
}
注意事项
- 资源管理:使用try-with-resources自动关闭流
- 编码问题:字符流操作时注意指定编码(如UTF-8)
- 异常处理:适当处理IOException
- 路径问题:注意使用File.separator来处理不同系统的路径分隔符
- 大文件处理:使用缓冲区提高效率
这些案例覆盖了Java文件流操作的核心功能,你可以根据实际需求灵活组合使用。