首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 文件操作完全指南:建立、刪除、讀寫、遍歷與 JSP 整合實戰

     編輯:Java 相關知識

核心 API 概覽

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 極其簡潔。

場景三:文本文件讀取——三種主流方式對比

方式 1:FileReader + 字符流(適合小文本)

<%@ 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>");
        }
    }
%>

方式 2:Files.readAllLines()(Java 7+,一行代碼)

<%@ 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>");
%>

方式 3:Files.lines() 流式處理(大文件、內存友好)

<%@ 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
}

指定編碼(推薦 UTF-8)

// NIO 方式,顯式指定 Charset
Files.writeString(path, "中文內容", StandardCharsets.UTF_8, 
                  StandardOpenOption.CREATE, StandardOpenOption.APPEND);

JSP/Servlet 環境下的路徑最佳實踐

需求推薦 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。
  • 大文件 OOM: 禁用 readAllLines()/readAllBytes(),改用流式處理。

總結

從 java.io.File 的元數據操作,到 BufferedReader/Writer 的經典流,再到 java.nio.file.Files 的現代化靜態工具類,Java 文件 I/O 已形成完整體系。新項目優先選擇 NIO.2 API:代碼更簡潔、編碼更安全、支持流式處理、功能更豐富(屬性讀寫、符號鏈接、文件監聽)。在 JSP/Servlet 中,嚴格區分 Web 部署路徑與業務數據存儲路徑,配合外部化配置,構建可維護、可擴展的文件管理模塊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved