---
# System prepended metadata

title: 串流(Stream)的使用

---

# 串流(Stream)的使用

為什麼要使用串流呢?
舉一個常見的例子，
常常發現以下的讀取檔案方式。
把整個檔案讀到記憶體，
再將檔案輸出，
但想一下檔案是10G大小時呢?

``` C#
Stream fileStream = File.OpenRead(filePath);
// 建立一個跟讀入Stream一樣大的記憶體
// 也就是檔案10G，就要用掉10G的記憶體
byte[] buff = new byte[fileStream.Length];

// 整個檔案讀入到buff
fileStream.Read(buff, 0, buff.Length);
fileStream.Close();

// buff寫入Response
Response.OutputStream.Write(buff, 0, buff.Length);
```

上面的例子來看，
會直接佔用10G的記憶體，
非常可怕。
所以建議改寫成，
讀一部分，便寫出一部分。
如以下的例子。

``` C#
// Stream是IDisposable
using(Stream fileStream = File.OpenRead(filePath))
{
    // 讀入檔案到buff，buff限制4K大小
    byte[] buff = new byte[4096];
    int readLength = fileStream.Read(buff, 0, buff.Length);

    while (readLength > 0)
    {
        // 讀入多少byte，即寫出多少byte
        Response.OutputStream.Write(buff, 0, readLength);
        readLength = fileStream.Read(buff, 0, buff.Length);
    }

    // 最好要加
    Response.OutputStream.Flush();
}
```

待續...... BufferedStream的使用