java.io.File 是文件/目錄路徑的抽象表示(不保證存在)。本文系統覆蓋創建/刪除/重命名、目錄操作、屬性讀取/設置、遞歸遍歷、文本讀寫、管道線程通信,並對比 NIO.2 現代 API。
// 創建文件
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);
// 單級
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();
}
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(); // 僅讀,視文件系統支持
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);
// 讀取
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");
}
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();
| 操作 | File (舊) | Files/Path (新) |
|---|---|---|
| 讀取所有行 | BufferedReader 循環 | Files.readAllLines(path, UTF_8) |
| 寫入所有行 | BufferedWriter 循環 | Files.write(path, lines, UTF_8, CREATE, APPEND) |
| 拷貝文件 | 手工流拷貝 | Files.copy(src, dest, REPLACE_EXISTING) |
| 遍歷目錄 | 遞歸 listFiles | Files.walk(root).filter(Files::isRegularFile) |
| 屬性讀取 | File 方法 | Files.getAttribute(path, "size") / Files.readAttributes() |
| 創建臨時文件 | File.createTempFile | Files.createTempFile(prefix, suffix) |