Java I/O 串流總覽

Java 中的資料匯入

Anthony Markham

VP Quant Developer

串流基礎

  • 串流是單向資料管線,遵循 FIFO(先進先出)順序
  • 位元組串流處理原始二進位資料(InputStream/OutputStream
  • 字元串流處理文字並自動編碼(Reader/Writer

串流示意

Java 中的資料匯入

位元組串流(Byte Streams)

  • 用於二進位資料(影像、音訊等)
  • 基底抽象類別:InputStream(讀取)、OutputStream(寫入)
  • 重要實作:FileInputStreamFileOutputStream
  • 關鍵方法:read() 回傳位元組,write() 輸出位元組

二進位檔:影像與音訊

Java 中的資料匯入

位元組串流(Byte Streams)

try (FileInputStream fis = new FileInputStream("data.bin")) {

byte[] buffer = new byte[1024]; int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) { // Process bytes in buffer
System.out.println("Read " + bytesRead + " bytes"); }
} catch (Exception e) { System.err.println("Error: " + e.getMessage()); }
Java 中的資料匯入

字元串流(Character Streams)

  • 專為文字資料設計
  • 基底抽象類別:Reader(讀取文字)、Writer(寫入文字)
  • 重要實作:FileReaderFileWriterBufferedReaderBufferedWriter
  • 便利方法:readLine() 一次讀取一整行文字

CSV 檔案

Java 中的資料匯入

字元串流(Character Streams)

try (BufferedReader reader = new BufferedReader(new FileReader("data.csv"))) {
    String line;

while ((line = reader.readLine()) != null) { // Process each line System.out.println(line); }
} catch (Exception e) { System.err.println("Error: " + e.getMessage()); }
Java 中的資料匯入

緩衝串流與效能

  • 透過減少磁碟操作來提升效能
  • 讀寫「位元組」串流用 BufferedInputStreamBufferedOutputStream
  • 讀寫「字元」串流用 BufferedReaderBufferedWriter
    • readLine() 讀取整行
Java 中的資料匯入

緩衝串流與效能

try (BufferedReader reader = new BufferedReader(new FileReader("data.csv"))) {
    // Header processing
    String header = reader.readLine();
    System.out.println("Header: " + header);

// Efficient data reading String line; int count = 0; while ((line = reader.readLine()) != null) { count++; } System.out.println("Read " + count + " data rows"); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); }
Java 中的資料匯入

串流串接(Stream chaining)

  • 串接中的每一層都提供特定功能
  • 常見模式:FileInputStream -> InputStreamReader -> BufferedReader
  • 總是關閉最外層串流(其餘會自動關閉)
Java 中的資料匯入

串流串接(Stream chaining)

import java.nio.charset.StandardCharsets;
try (

BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("data.csv"),
StandardCharsets.UTF_8 )
)
) { String line; while ((line = reader.readLine()) != null) { System.out.println(line);} } catch (Exception e) { System.err.println("Error: " + e.getMessage()); }
Java 中的資料匯入

例外處理(Exception handling)

  • 對 I/O 作業至關重要
  • 常見例外:IOExceptionFileNotFoundException
  • 一律使用 try-with-resources 來捕捉例外
Java 中的資料匯入

例外處理(Exception handling)

import java.util.ArrayList;
import java.util.List;
public static List<String> readLines(String filePath) throws IOException {

List<String> lines = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { lines.add(line); } } // 這裡會自動關閉串流 return lines;
}
Java 中的資料匯入

一起來練習吧!

Java 中的資料匯入

Preparing Video For Download...