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

Java 讀取文件三大經典方式完整代碼詳解(含性能對比建議)

     編輯:Java 相關知識

前言

Java 中讀取文件內容有多種方式,各有適用場景。本文整理三種最經典的讀取方法,提供完整可運行代碼,並分析優缺點與適用場景,助你根據實際需求選擇最佳方案。

完整代碼範例(含異常處理)

import java.io.*;

public class FileReadDemo {
    public static void main(String[] args) {
        String filePath = "D:\\1.xls"; // Windows 路徑需轉義反斜槓

        try {
            // ========== 方法一:BufferedReader 逐行讀取(推薦文本文件) ==========
            System.out.println("=== 方法一:BufferedReader ===");
            try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                    sb.append(line).append(System.lineSeparator());
                }
                // System.out.println(sb.toString()); // 如需完整字串
            }

            // ========== 方法二:FileInputStream 位元組一次性讀取(適合二進制/小文件) ==========
            System.out.println("\n=== 方法二:FileInputStream ===");
            try (FileInputStream is = new FileInputStream(filePath)) {
                // 獲取文件長度創建位元組陣列(注意:大文件會 OOM!)
                byte[] bytes = new byte[(int) new File(filePath).length()];
                int read = is.read(bytes);
                System.out.write(bytes, 0, read); // 直接輸出到控制台
                System.out.println();
            }

            // ========== 方法三:FileReader 字符一次性讀取(適合小文本文件) ==========
            System.out.println("\n=== 方法三:FileReader ===");
            try (FileReader fr = new FileReader(filePath)) {
                char[] chars = new char[(int) new File(filePath).length()];
                int read = fr.read(chars);
                String content = new String(chars, 0, read);
                System.out.print(content);
            }

        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + filePath);
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("讀取文件發生 I/O 錯誤");
            e.printStackTrace();
        }
    }
}

三種方式深度對比

維度方法一:BufferedReader方法二:FileInputStream方法三:FileReader
數據類型字符流(文本)位元組流(二進制/文本)字符流(文本)
讀取方式逐行緩衝讀取一次性讀入記憶體一次性讀入記憶體
記憶體佔用極低(行級緩衝)高(文件大小=陣列大小)高(文件大小=陣列大小)
大文件適用性✅ 極佳❌ 易 OOM❌ 易 OOM
編碼處理依賴平台預設編碼無編碼概念(原始位元組)依賴平台預設編碼
適用場景日誌、CSV、大文本文件圖片、視頻、小配置文件小型文本文件、配置文件

現代 Java 建議(NIO.2 / Files API)

JDK 7+ 強烈建議使用 java.nio.file.Files 簡化代碼並提升性能:

逐行讀取(流式,記憶體友好)

try (Stream<String> lines = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8)) {
    lines.forEach(System.out::println);
}

一次性讀取所有行(小文件)

List<String> lines = Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8);

讀取二進制文件

byte[] bytes = Files.readAllBytes(Paths.get(filePath));

關鍵最佳實踐總結

  • 大文件必須用流式讀取(BufferedReader 或 Files.lines),避免一次性載入導致 OOM。
  • 顯式指定編碼(如 StandardCharsets.UTF_8),避免跨平台亂碼。
  • 統一使用 try-with-resources 自動關閉資源,防止洩漏。
  • 二進制文件用位元組流,文本文件用字符流。
  • JDK 7+ 首選 NIO.2 API,代碼更簡潔、功能更強大(支援路徑匹配、屬性讀取等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved