java.io.File 類是文件/目錄路徑的抽象表示,不直接處理數據流,僅負責元數據操作(創建、刪除、重命名、屬性查詢、目錄遍歷)。實際讀寫需配合 FileReader/Writer、FileInputStream/OutputStream、BufferedReader/Writer 等流類。
<%@ page import="java.io.*" %>
<%
// 獲取部署路徑下的絕對磁盤路徑
String basePath = application.getRealPath("/WEB-INF/data");
File target = new File(basePath, "demo.txt");
if (target.exists()) {
boolean deleted = target.delete(); // 刪除文件
out.println("文件已存在,刪除結果:" + deleted + "<br>");
} else {
boolean created = target.createNewFile(); // 原子創建
out.println("文件不存在,創建結果:" + created + "<br>");
}
out.println("絕對路徑:" + target.getAbsolutePath());
%>
注意: createNewFile() 只有在文件不存在時才創建並返回 true,避免了「檢查-創建」競態條件。
<%@ page import="java.io.*, java.util.*" %>
<%
File dir = new File(application.getRealPath("/WEB-INF/uploads"));
File[] files = dir.listFiles((d, name) -> name.endsWith(".pdf")); // Lambda 過濾 PDF
out.println("<ul>");
for (File f : files) {
out.printf("<li>%s (%d KB)</li>", f.getName(), f.length()/1024);
}
out.println("</ul>");
%>
listFiles(FileFilter) 支持自定義過濾邏輯,配合 Java 8 Lambda 極其簡潔。
<%@ page import="java.io.*" %>
<%
File file = new File(application.getRealPath("/WEB-INF/data/demo.txt"));
try (FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
out.println(line + "<br>");
}
}
%>
<%@ page import="java.nio.file.*, java.util.*" %>
<%
Path path = Paths.get(application.getRealPath("/WEB-INF/data/demo.txt"));
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (String l : lines) out.println(l + "<br>");
%>
<%@ page import="java.nio.file.*, java.util.stream.*" %>
<%
Path path = Paths.get(application.getRealPath("/WEB-INF/logs/access.log"));
try (Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8)) {
stream.filter(l -> l.contains("ERROR"))
.limit(100)
.forEach(l -> out.println(l + "<br>"));
}
%>
try (FileWriter fw = new FileWriter(file, false); // false = 覆蓋
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write("第一行內容");
bw.newLine(); // 跨平台換行
bw.write("第二行內容");
}
try (FileWriter fw = new FileWriter(file, true); // true = 追加
PrintWriter pw = new PrintWriter(fw)) {
pw.println("追加的日誌行"); // 自動換行 + flush
}
// NIO 方式,顯式指定 Charset
Files.writeString(path, "中文內容", StandardCharsets.UTF_8,
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
| 需求 | 推薦 API | 示例 |
|---|---|---|
| Web 目錄下靜態資源 | servletContext.getRealPath("/path") | getRealPath("/WEB-INF/data") |
| 臨時文件 | Files.createTempFile() | 系統臨時目錄,自動清理 |
| 用戶上傳文件存儲 | 配置外部存儲路徑(非 Web 目錄) | /data/uploads/{userId}/ |
| 類路徑資源 | ClassLoader.getResourceAsStream() | 讀取 JAR 內配置文件 |
File.separator 或 Paths.get(),勿硬編碼 / 或 \\。FileReader/Writer 使用平台默認編碼(Windows GBK,Linux UTF-8),務必顯式指定 UTF-8,改用 NIO Files 或 InputStreamReader(..., StandardCharsets.UTF_8)。try-with-resources(Java 7+)自動關閉流。FileLock、寫入臨時文件再 atomicMove。readAllLines()/readAllBytes(),改用流式處理。從 java.io.File 的元數據操作,到 BufferedReader/Writer 的經典流,再到 java.nio.file.Files 的現代化靜態工具類,Java 文件 I/O 已形成完整體系。新項目優先選擇 NIO.2 API:代碼更簡潔、編碼更安全、支持流式處理、功能更豐富(屬性讀寫、符號鏈接、文件監聽)。在 JSP/Servlet 中,嚴格區分 Web 部署路徑與業務數據存儲路徑,配合外部化配置,構建可維護、可擴展的文件管理模塊。