java.io.File 類代表文件系統中的文件或目錄路徑(不可直接讀寫文件內容)。核心能力:
exists()、isFile()、isDirectory()、length()、lastModified()mkdir()、mkdirs()、list()、listFiles()createNewFile()、delete()、renameTo()// 錯誤寫法:硬編碼分隔符
File f1 = new File("D:/data/test.txt"); // Windows 可行,Linux 失敗
// 正確寫法:使用 File.separator 或 Paths.get()
File f2 = new File("." + File.separator + "aa.txt"); // 當前目錄下 aa.txt
// 或 Java 7+ 推薦
Path path = Paths.get(".", "aa.txt"); // 自動處理分隔符
File f3 = path.toFile();
File file = new File("." + File.separator + "aa.txt");
System.out.println("文件是否存在: " + file.exists());
if (!file.exists()) {
try {
boolean created = file.createNewFile();
System.out.println("創建結果: " + created);
} catch (IOException e) {
e.printStackTrace(); // 生產環境請使用 SLF4J 記錄
}
}
Java IO 按數據單位分為字節流(8-bit)和字符流(16-bit Unicode);按流向分為輸入流(讀)和輸出流(寫)。
| 分類 | 抽象基類 | 文件操作實現 | 緩衝增強 | 轉換橋接 |
|---|---|---|---|---|
| 字節流 | InputStream / OutputStream | FileInputStream / FileOutputStream | BufferedInputStream / BufferedOutputStream | — |
| 字符流 | Reader / Writer | FileReader / FileWriter | BufferedReader / BufferedWriter | InputStreamReader / OutputStreamWriter |
public static void copyFileByte(String src, String dest) {
try (FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
byte[] buffer = new byte[8192]; // 8KB 緩衝區
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (IOException e) { e.printStackTrace(); }
}
public static void copyFileChar(String src, String dest, String charset) {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(src), charset));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(dest), charset))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 跨平台換行
}
} catch (IOException e) { e.printStackTrace(); }
}
BufferedReader.readLine():按行讀取文本,返回不含換行符的字符串BufferedWriter.newLine():寫入系統默認行分隔符BufferedInputStream.mark()/reset():支持標記重讀InputStreamReader:字節流→字符流(解碼)
OutputStreamWriter:字符流→字節流(編碼)
// 核心構造方法:指定字符集,避免平台默認編碼導致亂碼
Reader reader = new InputStreamReader(new FileInputStream("data.txt"), "UTF-8");
Writer writer = new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8");
所有實現 AutoCloseable 的流對象均可在 try 括號中聲明,編譯器自動生成 finally 關閉代碼,彻底解決資源洩漏。
// 等價於手動 finally close(),但更簡潔、異常安全
try (FileInputStream fis = new FileInputStream("in.txt");
FileOutputStream fos = new FileOutputStream("out.txt")) {
// 業務代碼
} // 編譯器自動插入 fis.close(); fos.close();
BufferedInputStream 包裝 FileInputStream)ObjectOutputStream/ObjectInputStream 實現對象持久化,需實現 SerializableFiles、Paths、Path API 更現代、支持符號鏈接、屬性讀取、異步 IO記住:File 類只管路徑元數據,不管內容;讀寫內容必須用流。字節流是基礎,字符流是字節流經過編碼轉換的包裝。緩衝流是性能優化利器,裝飾者模式讓組合靈活無限。