有附加功能的串流

Prerequisites:

原文: adds functionality to stream

意思是在以下8種串流基礎上,增加其它功能的串流,稱作裝飾串流。

串流讀寫格式分為byte、字元。

byte串流

讀寫位置 輸入(讀) 輸出(寫)
檔案 FileInputStream FileOutputStream
記憶體 ByteArrayInputStream ByteArrayOutputStream

字元串流

讀寫位置 輸入(讀) 輸出(寫)
檔案 FileReader FileWriter
記憶體 CharArrayReader CharArrayWriter

裝飾串流

裝飾串流指的是有附加功能串流,並非以上8種串流。

有很多裝飾串流,目前只想說明下列幾種,下圖已經把裝飾串流的功能寫上。

byte串流

img

char串流

img

要了解裝飾串流的原理,可以查看IO裝飾者模式

關閉串流

直接關閉最外層的裝飾串流,程式會使用最內部的串流(檔案串流或記憶體串流),把串流關閉,內部的串流在源始碼的變數為in。

什麼是最外層的裝飾串流?以下裝飾串流分別為ObjectInputStream、BufferedInputStream,最外層的裝飾串流是ObjectInputStream。

1
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("/Users/cici/testc/1.dat")));

以下程式碼,把檔案讀取串流變成一個變數fis,裝飾串流buff_in變數,關閉串流不用把二個close,直接關閉最外層的裝飾串流buff_in。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  FileInputStream fis = null;
  BufferedInputStream buff_in = null;
  try {
    fis = new FileInputStream("/Users/cici/testc/1.png");
    buff_in = new BufferedInputStream(fis);
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
      // 只要關閉最外面的裝飾串流
      if (buff_in != null)
        buff_in.close();
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

BufferedReader

建構子

參數只能接收Reader的子類別(處理字元的串流)。

1
BufferedReader(Reader in)

readLine()

提供一列一列讀取的功能,讀完資料沒有資料可以讀會傳回null。

1
2
// Reads a line of text
String readLine()

內部使用緩衝buffer功能,提高讀取效率。

1
2
3
4
5
6
7
8
  BufferedReader bufferedReader = null;
  try {
    bufferedReader = new BufferedReader(new FileReader("/Users/cici/testc/file_test"));
    String line = null;
    while((line = bufferedReader.readLine()) != null) {
      System.out.println(line);
    }
  }
測試程式

java程式設計

write()與newLine()

write()不會自動換行,需使用BufferedWriter.newLine()才會換行。

1
2
3
4
5
6
7
8
9
10
11
12
  BufferedWriter bufferedWriter = null;
  try {
    bufferedWriter = new BufferedWriter(new FileWriter("/Users/cici/testc/file_test"));
    // 寫一行
    bufferedWriter.write("測試程式");
    // 換行
    bufferedWriter.newLine();
    // 寫一行
    bufferedWriter.write("java程式設計");
    // 換行
    bufferedWriter.newLine();
  }
測試程式
java程式設計

BufferedInputStream與BufferedOutputStream

使用緩衝區高效讀取與寫入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  BufferedInputStream buff_in = null;
  BufferedOutputStream buff_out = null;
  try {
    buff_in = new BufferedInputStream(new FileInputStream("/Users/cici/testc/1.png"));
    buff_out = new BufferedOutputStream(new FileOutputStream("/Users/cici/testc/3.png"));
    // 每次迴圈讀到的byte數
    int len = 0;
    // 建立buffer
    byte[] buff = new byte[1024];
    while ((len = buff_in.read(buff)) != -1) {
      // 寫入
      buff_out.write(buff, 0, len);
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
      if (buff_in != null)
        buff_in.close();
      if (buff_out != null)
        buff_out.close();
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

results matching ""

    No results matching ""