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

Java I/O 核心實戰:文件過濾、讀取與寫入完整指南

     編輯:Java 綜合教學

前言

Java I/O 是基礎且高頻的開發場景。本文通過三個完整代碼示例,系統講解 FilenameFilter 文件過濾、FileInputStream 位元組流讀取、FileOutputStream 位元組流寫入的核心用法與常見坑點。

一、文件過濾:實現 FilenameFilter 接口

public class FileFilterDemo implements FilenameFilter {
    public static void main(String[] args) {
        File dir = new File("F:\\java\\workspace\\Fanshe");
        String[] matched = dir.list(new FileFilterDemo()); // 回調 accept()
        if (matched != null && matched.length > 0) {
            System.out.println("匹配到: " + matched[0]);
        }
    }

    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(".classpath"); // 只保留 .classpath 結尾
    }
}

關鍵點:

  • list(FilenameFilter) 會對目錄下每個文件名調用 accept(),返回 true 者納入結果陣列
  • 可靈活組合條件:name.startsWith()、name.matches(regex) 等
  • 注意:list() 若目錄不存在或非目錄返回 null,需非空判斷

二、文件讀取:FileInputStream 位元組流

public class FileReadDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("F:\\java\\workspace\\Fanshe\\src\\com\\cyg\\fanshe.java");
        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] buffer = new byte[fis.available()]; // 獲取文件位元組數(小文件適用)
            int readCount = fis.read(buffer); // 一次性讀入
            if (readCount != -1) {
                System.out.println(new String(buffer, StandardCharsets.UTF_8)); // 指定編碼
            }
        } // try-with-resources 自動關閉
    }
}

進階建議:

  • 大文件請用 byte[4096] 緩衝區循環讀取,避免 OOM
  • 文本文件優先考慮 FileReader / BufferedReader 逐行讀取
  • 指定 StandardCharsets.UTF_8 避免平台預設編碼差異導致亂碼

三、文件寫入:FileOutputStream 位元組流

public class FileWriteDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("F:\\a.txt");
        try (FileOutputStream fos = new FileOutputStream(file)) { // 預設覆蓋模式
            String content = "admin";
            fos.write(content.getBytes(StandardCharsets.UTF_8));
            fos.flush(); // 強制刷新緩衝區
        } // 自動 close() 含 flush
    }
}

常用變體:

  • 追加模式:new FileOutputStream(file, true)
  • 高性能寫入:包裝 BufferedOutputStream
  • 文本寫入:FileWriter / BufferedWriter / PrintWriter

最佳實踐總結

場景推薦類/方法關鍵參數
小文件全讀Files.readAllBytes() / FileInputStream.available()指定 Charset
大文件流式讀BufferedInputStream + byte[8192]循環 read() 直到 -1
文本逐行讀Files.lines() / BufferedReader.readLine()try-with-resources
覆蓋寫入FileOutputStream / Files.write()StandardOpenOption.CREATE
追加寫入FileOutputStream(file,true) / Files.write(..., APPEND)StandardOpenOption.APPEND

避坑指南

  1. 忘記 close() → 檔案鎖佔用、資料未刷新 → 統一使用 try-with-resources
  2. 未指定編碼 → 中文亂碼 → 強制 StandardCharsets.UTF_8
  3. available() 用於大文件 → 記憶體溢出 → 改用固定緩衝區循環讀取
  4. 路徑分隔符硬編碼 → 跨平台失效 → 用 File.separator 或 Paths.get()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved