1. JavaEE文件操作与IO基础概念
在JavaEE开发中,文件操作和IO(Input/Output)是最基础也是最重要的技能之一。IO操作直接关系到应用程序与外部世界的数据交换能力,而文件操作则是持久化存储的核心手段。我们先从最基础的概念开始梳理。
Java中的IO主要分为两种类型:
- 字节流(InputStream/OutputStream):以字节为单位进行读写,适合处理二进制文件
- 字符流(Reader/Writer):以字符为单位进行读写,适合处理文本文件
提示:Java 7引入了NIO.2(New I/O)API,提供了更现代的文件操作方式,但传统的IO API仍然是必须掌握的基础。
文件操作的核心类是java.io.File,它代表文件系统中的文件或目录。虽然Java 7之后推荐使用java.nio.file.Path,但File类在现有代码库中仍然广泛存在。File类提供了以下常用功能:
- 检查文件/目录是否存在(exists())
- 创建新文件(createNewFile())
- 创建目录(mkdir()/mkdirs())
- 获取文件属性(length(), lastModified()等)
- 列出目录内容(list(), listFiles())
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 传统IO流操作详解
2.1 字节流操作实践
字节流是处理二进制数据的基础。我们来看一个文件复制的经典例子:
java复制try (InputStream in = new FileInputStream("source.jpg");
OutputStream out = new FileOutputStream("target.jpg")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
这段代码展示了几个关键点:
- 使用try-with-resources确保流自动关闭
- 使用缓冲区(byte数组)提高效率
- 正确处理读取的字节数(bytesRead)
注意:直接使用无缓冲的IO流(如FileInputStream)进行单字节读写性能极差,务必使用缓冲或NIO。
2.2 字符流与文本处理
处理文本文件时,字符流更为合适。Java提供了转换流(InputStreamReader/OutputStreamWriter)来桥接字节流和字符流:
java复制try (BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("text.txt"), StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
这里有几个实用技巧:
- 指定字符编码(StandardCharsets.UTF_8)避免平台默认编码问题
- 使用BufferedReader提高读取效率
- readLine()方法方便逐行处理文本
3. NIO.2现代文件操作
Java 7引入的NIO.2 API提供了更强大的文件操作能力。核心类是java.nio.file.Files和java.nio.file.Path。
3.1 Path接口基础用法
Path接口比传统的File类更灵活:
java复制Path path = Paths.get("data", "subdir", "file.txt");
System.out.println("文件名: " + path.getFileName());
System.out.println("父目录: " + path.getParent());
System.out.println("绝对路径: " + path.toAbsolutePath());
Path的优势在于:
- 路径拼接更直观(使用Paths.get())
- 更好的跨平台支持(自动处理路径分隔符)
- 提供更多实用方法(resolve(), relativize()等)
3.2 Files类高效操作
Files类提供了丰富的静态方法:
java复制// 读取小文件内容为字节数组
byte[] bytes = Files.readAllBytes(path);
// 按行读取文本文件
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
// 写入文件
Files.write(path, "内容".getBytes(StandardCharsets.UTF_8));
// 创建目录(包括不存在的父目录)
Files.createDirectories(path);
重要:Files类的方法大多设计用于处理中小文件。大文件处理应使用流式API。
4. 实战中的性能优化与问题排查
4.1 IO性能优化技巧
在实际项目中,IO性能常常成为瓶颈。以下是一些实测有效的优化手段:
- 缓冲区大小选择:
- 默认缓冲区大小(通常8KB)可能不是最优的
- 根据文件大小调整
