一、文件操作基礎:File 類
作用:操作文件或目錄(創建、刪除、獲取信息)。
核心方法:
exists()
:文件是否存在createNewFile()
:創建新文件mkdir()
:創建目錄delete()
:刪除文件或目錄
代碼示例:
import java.io.File;
import java.io.IOException;public class FileCreateDemo {public static void main(String[] args) {// 1. 創建文件對象(不實際創建文件)File file = new File("test.txt");try {// 2. 創建文件(需處理 IOException)if (file.createNewFile()) {System.out.println("文件創建成功");} else {System.out.println("文件已存在");}} catch (IOException e) {e.printStackTrace();}// 3. 創建目錄(單層)File dir = new File("mydir");if (dir.mkdir()) {System.out.println("目錄創建成功");}// 4. 創建多級目錄File multiDir = new File("parent/child");if (multiDir.mkdirs()) {System.out.println("多級目錄創建成功");}}
}
重點:
new File("路徑")
?只是創建對象,不會實際創建文件。- 操作可能拋出?
IOException
,必須處理異常。 createNewFile()
:原子性操作,文件不存在時創建并返回?true
mkdir()
?與?mkdirs()
:后者可創建多級目錄- 路徑分隔符:Windows 用?
\
(需轉義為?\\
),Linux/Mac 用?/
2. 刪除與判斷文件屬性
public class FileDeleteDemo {public static void main(String[] args) {File file = new File("test.txt");// 1. 刪除文件(立刻刪除,非移到回收站)if (file.delete()) {System.out.println("文件刪除成功");}// 2. 判斷文件屬性System.out.println("是否隱藏文件: " + file.isHidden());System.out.println("是否可讀: " + file.canRead());System.out.println("最后修改時間: " + file.lastModified());}
}
二、IO 流分類與核心類
1. 按方向分
- 輸入流:從文件/網絡讀取數據 →?
InputStream
,?Reader
- 輸出流:向文件/網絡寫入數據 →?
OutputStream
,?Writer
2. 按數據類型分
類型 | 字節流(二進制) | 字符流(文本) |
---|---|---|
輸入 | InputStream | Reader |
輸出 | OutputStream | Writer |
為什么需要字符流?
直接處理文本更方便,自動處理字符編碼(如 UTF-8)。
三、字節流實戰:文件復制
代碼示例:
import java.io.*;public class FileCopy {public static void main(String[] args) {// 1. 定義輸入輸出文件File srcFile = new File("source.jpg");File destFile = new File("copy.jpg");// 2. 使用 try-with-resources 自動關閉流try (InputStream is = new FileInputStream(srcFile);OutputStream os = new FileOutputStream(destFile)) {// 3. 緩沖區提高效率byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len); // 寫入實際讀取的字節數}System.out.println("文件復制完成");} catch (IOException e) {e.printStackTrace();}}
}
重點:
try-with-resources
?自動關閉流,避免資源泄漏。- 緩沖區大小(如 1024)影響性能,通常設為 4KB~8KB。
read()
?返回實際讀取字節數,避免寫入多余數據。- 逐字節讀寫效率極低,需優化為緩沖區讀寫。
四、字符流實戰:讀寫文本文件
代碼示例(處理中文不亂碼):
import java.io.*;public class TextFileDemo {public static void main(String[] args) {// 寫入文件(UTF-8編碼)try (Writer writer = new FileWriter("data.txt", StandardCharsets.UTF_8)) {writer.write("你好,JavaEE!\n");writer.write("Hello, World!");} catch (IOException e) {e.printStackTrace();}// 讀取文件try (Reader reader = new FileReader("data.txt", StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(reader)) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
重點:
FileWriter
/FileReader
?默認使用系統編碼,建議顯式指定(如 UTF-8)。BufferedReader
?提升讀取效率,readLine()
?逐行讀取。五、緩沖流:性能優化利器
代碼示例:
-
public class BufferedByteStreamDemo {public static void main(String[] args) {try (InputStream is = new FileInputStream("source.jpg");BufferedInputStream bis = new BufferedInputStream(is); // 添加緩沖OutputStream os = new FileOutputStream("copy.jpg");BufferedOutputStream bos = new BufferedOutputStream(os)) {byte[] buffer = new byte[8192]; // 8KB 緩沖區int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len); // 寫入實際讀取的字節數}} catch (IOException e) {e.printStackTrace();}} }
重點:
- 緩沖流(BufferedXXX)通過減少物理 IO 次數提升性能。
- 默認緩沖區大小 8KB,可根據需求調整。
- 沖區大小通常設為 4096(4KB)~ 8192(8KB)
BufferedInputStream
?內部維護 8KB 緩沖區,減少物理磁盤訪問次數
六、NIO 新特性:更簡潔的文件操作
Java NIO(New IO)核心類:
Path
:替代?File
?類,路徑操作更靈活Files
:提供靜態方法簡化文件操作
代碼示例:
import java.nio.file.*;public class NioDemo {public static void main(String[] args) {Path source = Paths.get("source.txt");Path target = Paths.get("backup.txt");try {// 復制文件(自動覆蓋)Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);// 讀取所有行(UTF-8)List<String> lines = Files.readAllLines(source);lines.forEach(System.out::println);// 寫入文件Files.write(target, "新內容".getBytes());} catch (IOException e) {e.printStackTrace();}}
}
重點:
Files.copy()
?比傳統 IO 更簡潔。readAllLines()
?適合小文件,大文件仍需流式讀取。
七、高級應用場景
1. 文件監控(WatchService)
public class FileWatcherDemo {public static void main(String[] args) throws IOException {WatchService watchService = FileSystems.getDefault().newWatchService();Path dir = Paths.get("."); // 監控當前目錄dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);while (true) {WatchKey key = watchService.take(); // 阻塞直到事件發生for (WatchEvent<?> event : key.pollEvents()) {System.out.println("事件類型: " + event.kind());System.out.println("文件: " + event.context());}key.reset(); // 重置監聽}}
}
2. 大文件逐行處理(內存優化)
public class LargeFileProcessor {public static void main(String[] args) {try (Stream<String> lines = Files.lines(Paths.get("bigdata.txt"))) {lines.filter(line -> line.contains("error")).forEach(System.out::println);} catch (IOException e) {e.printStackTrace();}}
}
八、核心總結
- 選擇流類型:
- 文本文件 → 字符流(Reader/Writer)
- 圖片/視頻 → 字節流(InputStream/OutputStream)
- 性能優化:
- 使用緩沖流(BufferedXXX)
- 合理設置緩沖區大小
- 資源管理:
- 必須用?
try-with-resources
?或手動關閉流
- 必須用?
- NIO 優勢:
- 更簡潔的 API
- 支持異步和非阻塞 IO(高級特性)