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

Java 本地文件操作完全指南:File API 核心方法、遞歸遍歷、管道通信與 NIO.2 現代寫法

     編輯:Java 綜合教學

Java 本地文件操作完全指南

java.io.File 是文件/目錄路徑的抽象表示(不保證存在)。本文系統覆蓋創建/刪除/重命名、目錄操作、屬性讀取/設置、遞歸遍歷、文本讀寫、管道線程通信,並對比 NIO.2 現代 API。

1. 文件基本操作


// 創建文件
File f = new File("Test.txt");
if (!f.exists()) f.createNewFile();

// 刪除
if (f.exists()) f.delete();

// 重命名/移動
File src = new File("src/Test.txt");
File dest = new File("src/TestTwo.txt");
src.renameTo(dest);

2. 目錄操作


// 單級
new File("src/Folder").mkdir();

// 多級
new File("Folder/one/two").mkdirs();  // 自動創建父目錄

// 刪除非空目錄(遞歸)
public static void deleteDir(File dir) {
    File[] files = dir.listFiles();
    if (files != null) {
        for (File f : files) {
            if (f.isDirectory()) deleteDir(f);
            f.delete();
        }
    }
    dir.delete();
}

3. 文件屬性讀取與設置


File f = new File("text.txt");
System.out.println("存在: " + f.exists());
System.out.println("名稱: " + f.getName());
System.out.println("路徑: " + f.getPath());
System.out.println("絕對路徑: " + f.getAbsolutePath());
System.out.println("父目錄: " + f.getParent());
System.out.println("大小: " + f.length()/1024.0 + " KB");
System.out.println("隱藏: " + f.isHidden());
System.out.println("可讀: " + f.canRead());
System.out.println("可寫: " + f.canWrite());
System.out.println("是目錄: " + f.isDirectory());

// 設置
f.setReadable(true);
f.setWritable(true);
f.setReadOnly();  // 僅讀,視文件系統支持

4. 遞歸遍歷目錄樹(帶縮進)


public static void printTree(File dir, int level) {
    if (dir == null || !dir.exists()) return;
    for (int i = 0; i < level; i++) System.out.print("|  ");
    System.out.println("|-- " + dir.getName());
    if (dir.isDirectory()) {
        File[] subs = dir.listFiles();
        if (subs != null) for (File sub : subs) printTree(sub, level + 1);
    }
}
// printTree(new File(".."), 0);

5. 文本文件讀寫(UTF-8 + try-with-resources)


// 讀取
try (BufferedReader br = new BufferedReader(
        new InputStreamReader(new FileInputStream("tangshi.txt"), StandardCharsets.UTF_8))) {
    String line;
    while ((line = br.readLine()) != null) System.out.println(line);
}

// 寫入
try (BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream("tangshi2.txt"), StandardCharsets.UTF_8))) {
    bw.write("登鸛雀樓\n");
    bw.write("唐 王之渙\n");
    bw.write("白日依山盡,黃河入海流。\n");
}

6. 管道流:線程間內存通信


class Writer extends Thread {
    private final PipedOutputStream out = new PipedOutputStream();
    public PipedOutputStream getOut() { return out; }
    @Override public void run() {
        try { out.write("Hello Pipe".getBytes()); out.close(); }
        catch (IOException e) { e.printStackTrace(); }
    }
}

class Reader extends Thread {
    private final PipedInputStream in = new PipedInputStream();
    public PipedInputStream getIn() { return in; }
    @Override public void run() {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
            String line;
            while ((line = br.readLine()) != null) System.out.println("Got: " + line);
        } catch (IOException e) { e.printStackTrace(); }
    }
}

// 主程序
Writer w = new Writer(); Reader r = new Reader();
w.getOut().connect(r.getIn());  // 必須綁定
w.start(); r.start();

7. NIO.2 (Java 7+) 現代寫法對比

8. 最佳實踐清單

  • 路徑分隔符用 File.separator 或 Paths.get(),保證跨平台
  • 文本操作必須指定 Charset(StandardCharsets.UTF_8)
  • 所有流操作用 try-with-resources 自動關閉
  • 大文件拷貝/移動優先 Files.copy/move(底層零拷貝/原子移動)
  • 目錄遍歷用 Files.walk 流式處理,避免一次性載入列表 OOM
  • 臨時文件用 Files.createTempFile,JVM 退出自動清理可加 deleteOnExit()

從 File 到 Path/Files 的演進,體現了 Java IO 從「面向流」到「面向路徑、函數式、零拷貝」的現代化轉型。新項目首選 NIO.2,舊代碼維護時按需遷移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作File (舊)Files/Path (新)
讀取所有行BufferedReader 循環Files.readAllLines(path, UTF_8)
寫入所有行BufferedWriter 循環Files.write(path, lines, UTF_8, CREATE, APPEND)
拷貝文件手工流拷貝Files.copy(src, dest, REPLACE_EXISTING)
遍歷目錄遞歸 listFilesFiles.walk(root).filter(Files::isRegularFile)
屬性讀取File 方法Files.getAttribute(path, "size") / Files.readAttributes()
創建臨時文件File.createTempFileFiles.createTempFile(prefix, suffix)