一篇文章教你學會用Java程序操作文件及避坑指南
前言
文件是IO流乃至多線程的基礎,學好文件這一板塊可以為我們后續(xù)進一步學習IO流和多線程打下堅實的基礎。在 Java 開發(fā)中,文件操作是高頻且基礎的核心技能 —— 無論是讀取配置文件、生成日志、導出報表,還是處理用戶上傳的文件,都離不開對文件的創(chuàng)建、讀取、寫入、刪除等操作。本文將從「實用場景」出發(fā),手把手教你掌握 Java 文件操作的核心方法,從傳統(tǒng) IO 到 NIO.2,兼顧基礎與最佳實踐,新手也能快速上手。
一、前置知識:Java 文件操作的核心 API
Java 提供了兩套核心文件操作體系,我們先理清它們的定位,避免用錯工具:
| 體系 | 核心包 / 類 | 特點 | 適用場景 |
|---|---|---|---|
| 傳統(tǒng) IO | java.io.File、FileReader、FileWriter | 兼容性好,API 偏底層 | 簡單文件操作、兼容老項目 |
| NIO.2 | java.nio.file(Paths、Files) | Java 7 新增,API 簡潔、功能強、效率高 | 新項目優(yōu)先使用,支持批量操作、文件屬性管理 |
本文以NIO.2為主(推薦),同時補充傳統(tǒng) IO 的核心用法,滿足不同場景需求。
二、實戰(zhàn):文件操作核心場景(附完整代碼)
所有示例代碼均可直接復制到 IDE 中運行,建議先創(chuàng)建測試目錄 / 文件,跟著步驟實操。
場景 1:基礎操作(創(chuàng)建、刪除、判斷文件 / 目錄)
這是文件操作的「基本功」,比如創(chuàng)建配置文件、判斷文件是否存在、刪除臨時文件等。
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileBasicOperations {
public static void main(String[] args) {
// ========== 1. 傳統(tǒng)IO(File類) ==========
// 定義文件路徑:Windows用\\(轉(zhuǎn)義)或/,Linux/Mac用/
File file = new File("test.txt");
try {
// 創(chuàng)建文件(不存在則創(chuàng)建,存在則返回false)
if (file.createNewFile()) {
System.out.println("文件創(chuàng)建成功:" + file.getAbsolutePath());
} else {
System.out.println("文件已存在");
}
// 核心判斷:文件/目錄類型
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否是目錄:" + file.isDirectory());
// 創(chuàng)建目錄:mkdir(單層)、mkdirs(多層,推薦)
File dir = new File("testDir/subDir");
if (dir.mkdirs()) {
System.out.println("多層目錄創(chuàng)建成功:" + dir.getAbsolutePath());
}
// 刪除文件/目錄(目錄需為空才能刪除)
if (file.delete()) {
System.out.println("文件刪除成功");
}
} catch (Exception e) {
e.printStackTrace(); // 捕獲IO異常(權限不足、路徑不存在等)
}
// ========== 2. NIO.2(推薦) ==========
Path path = Paths.get("test_nio.txt");
try {
// 創(chuàng)建文件(先判斷是否存在,避免重復創(chuàng)建)
if (!Files.exists(path)) {
Files.createFile(path);
System.out.println("NIO創(chuàng)建文件成功:" + path.toAbsolutePath());
}
// 創(chuàng)建多層目錄(無需區(qū)分單層/多層)
Path dirPath = Paths.get("testDirNio/subDir");
if (!Files.exists(dirPath)) {
Files.createDirectories(dirPath);
System.out.println("NIO創(chuàng)建目錄成功");
}
// 刪除文件/目錄(支持非空目錄?不,需手動遍歷刪除子文件)
if (Files.exists(path)) {
Files.delete(path);
System.out.println("NIO刪除文件成功");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
關鍵說明:
- 路徑適配:推薦用
Paths.get("目錄", "子目錄", "文件.txt"),自動適配不同系統(tǒng)的分隔符; - 異常處理:文件操作必然涉及 IO 異常,必須捕獲或聲明拋出;
- 目錄刪除:
delete()只能刪除空目錄,非空目錄需先遍歷刪除子文件 / 子目錄。
場景 2:文本文件讀?。ㄗ畛S茫?/h3>
讀取配置文件、日志文件、用戶上傳的文本等,NIO.2 的Files.readAllLines是最優(yōu)解。
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class FileReadExample {
public static void main(String[] args) {
String filePath = "read_test.txt"; // 先創(chuàng)建該文件并寫入測試內(nèi)容
// 方式1:一次性讀取所有行(推薦,簡潔)
try {
// 指定UTF-8編碼,避免中文亂碼
List<String> lines = Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8);
for (String line : lines) {
System.out.println("讀取到行:" + line);
}
} catch (Exception e) {
e.printStackTrace();
}
// 方式2:讀取為字節(jié)數(shù)組(兼容文本/二進制文件)
try {
byte[] content = Files.readAllBytes(Paths.get(filePath));
String contentStr = new String(content, StandardCharsets.UTF_8);
System.out.println("完整內(nèi)容:\n" + contentStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
關鍵說明:
- 編碼指定:必須顯式指定
StandardCharsets.UTF_8,否則會使用系統(tǒng)默認編碼,導致中文亂碼; - 大文件注意:
readAllLines/readAllBytes適合小文件(幾十 MB 內(nèi)),大文件需用流逐行讀?。ㄏ挛难a充)。
場景 3:文本文件寫入(覆蓋 / 追加)
生成日志、導出數(shù)據(jù)、寫入配置等場景,核心是「覆蓋寫入」和「追加寫入」。
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class FileWriteExample {
public static void main(String[] args) {
String filePath = "write_test.txt";
// 要寫入的內(nèi)容(按行存儲)
List<String> content = Arrays.asList("Java文件操作", "作者:新手學習", "時間:2026");
try {
// 方式1:覆蓋寫入(文件不存在則創(chuàng)建,存在則清空原有內(nèi)容)
Files.write(Paths.get(filePath), content, StandardCharsets.UTF_8);
System.out.println("覆蓋寫入成功");
// 方式2:追加寫入(保留原有內(nèi)容,在末尾添加)
List<String> appendContent = Arrays.asList("", "——追加的內(nèi)容"); // 空行分隔
Files.write(
Paths.get(filePath),
appendContent,
StandardCharsets.UTF_8,
java.nio.file.StandardOpenOption.APPEND // 追加模式
);
System.out.println("追加寫入成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
場景 4:遍歷目錄下的所有文件
比如批量處理某目錄下的所有 Excel 文件、統(tǒng)計日志文件數(shù)量等,NIO.2 的Files.walk非常高效。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class DirectoryTraverseExample {
public static void main(String[] args) {
String dirPath = "testDir"; // 目標目錄
// 遍歷目錄(包括子目錄),篩選所有文件
try (Stream<Path> walk = Files.walk(Paths.get(dirPath))) {
walk.filter(Files::isRegularFile) // 只保留文件(排除目錄)
.filter(path -> path.toString().endsWith(".txt")) // 篩選txt文件
.forEach(path -> System.out.println("符合條件的文件:" + path.toAbsolutePath()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
擴展:大文件讀寫(避免內(nèi)存溢出)
如果文件大小超過 100MB,不能用readAllLines一次性讀取,需用「流」逐行處理:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class BigFileOperation {
public static void main(String[] args) {
String srcPath = "big_file.txt"; // 大文件路徑
String destPath = "copy_big_file.txt"; // 復制后的文件
// 逐行讀取+逐行寫入(內(nèi)存占用極低)
try (BufferedReader br = Files.newBufferedReader(Paths.get(srcPath), StandardCharsets.UTF_8);
BufferedWriter bw = Files.newBufferedWriter(Paths.get(destPath), StandardCharsets.UTF_8)) {
String line;
while ((line = br.readLine()) != null) {
// 可在此處處理每行內(nèi)容(比如過濾、修改)
bw.write(line);
bw.newLine(); // 換行
}
System.out.println("大文件復制完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、避坑指南:新手常犯的錯誤
- 中文亂碼:未指定編碼,默認使用系統(tǒng)編碼(Windows 是 GBK,Linux 是 UTF-8),解決:所有讀寫操作顯式指定
StandardCharsets.UTF_8; - 路徑錯誤:硬編碼 Windows 路徑(如
C:\\test.txt),Linux 下運行報錯,解決:用Paths.get("C:", "test.txt")適配系統(tǒng); - 資源未關閉:傳統(tǒng) IO 的
FileInputStream未關閉導致文件被占用,解決:用try-with-resources語法(自動關閉資源); - 權限問題:寫入系統(tǒng)目錄(如 C 盤根目錄)報錯,解決:選擇有寫入權限的目錄(如項目根目錄、用戶目錄)。
四、總結
- Java 文件操作優(yōu)先使用
java.nio.file(NIO.2),API 簡潔且效率高,核心類是Paths(路徑)和Files(操作); - 小文件用
readAllLines/write一次性處理,大文件用BufferedReader/BufferedWriter逐行處理; - 所有文件操作必須處理 IO 異常,顯式指定 UTF-8 編碼,避免亂碼和兼容性問題。
掌握以上內(nèi)容,你就能應對 90% 的 Java 文件操作場景。如果需要處理二進制文件(如圖片、視頻)、文件復制 / 移動、文件屬性修改等進階操作,可在評論區(qū)留言,后續(xù)會補充對應的示例。
到此這篇關于Java程序操作文件及避坑指南的文章就介紹到這了,更多相關Java程序操作文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java Thread多線程開發(fā)中Object類詳細講解
這篇文章主要介紹了Java Thread多線程開發(fā)中Object類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-03-03
Idea中如何調(diào)出Run dashboard 或services窗口
這篇文章主要介紹了Idea中如何調(diào)出Run dashboard 或services窗口問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

