Home [C# 筆記] 讀取、寫入txt文字檔(BnaryReader & BinaryWrite)
Post
Cancel

[C# 筆記] 讀取、寫入txt文字檔(BnaryReader & BinaryWrite)

  • BinaryReader:把指定的資料流(Stream)當成「二進位」值讀取。
  • BinaryWrite:把資料用「二進位」方式寫進資料流(Stream)。

BinaryReader 是把指定的資料流當成二進位值讀取,當然二進位值以不同的編碼方式讀取的意義就會不同。
例如:1 byte 的資料以整數的角度 跟以字元的角度 去看(讀取方式)就會有不同的結果。

BinaryWrite提供特定編碼方式,以「二進位」的方式寫入指定的資料流。


C#的FileStream類別提供了最原始的位元組層級上的文件讀取和寫入功能,但我們習慣於對字串操作,於是StreamWriter和StreamReader類別增強了FileStream,它讓我們在字串層級上操作文件,

但有的時候我們還是需要在位元組層級上操作文件,卻又不是一​​個位元組一個位元組的操作,通常是2個、4個或8個位元組這樣操作,這便有了BinaryWriter和BinaryReader類,它們可以將一個字元或數字按指定個數byte寫入,也可以一次讀取指定個數byte轉為字元或數字。

(BinaryWriter 和 BinaryReader 類別用於讀取和寫入數據,而不是字串。)

  • BinaryReader/BinaryWrite 以二進式方式 讀取/寫入檔案內容
  • StreamReader/StreamWrite 以特定的編碼方式讀 取/寫入檔案內容

宣告方式

1
2
3
//BinaryReader和BinaryWrite 一開始需要接受資料流(stream) 才能進行相關操作
BinaryReader reader = new BinaryReader(stream名稱);
BinaryWrite write = BinaryWrite(stream名稱, 編碼方式)

命名空間

1
using System.IO;

用File開啟檔案

1
2
3
//用File開啟檔案
var stream = File.Open(path, FileMode.OpenOrCreate);
var reader = new BinaryReader(stream, Encoding.UTF8);

用 FileStream 開啟檔案

1
2
3
//用File開啟檔案
var fs = FileStream.Open(path, FileMode.OpenOrCreate);
var reader = new BinaryReader(fs, Encoding.UTF8);

寫入檔案

  • BinaryWrite:把資料用「二進位」方式寫進資料流(Stream)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//宣告FileStream,為開啟test.txt的檔案資料流,選擇FileMode.OpenOrCreate最保險,如果檔案不存在,就會新增一個
using (var fs = new FileStream(@"C:\Users\rivalin\Desktop\test.txt", FileMode.OpenOrCreate))
{
    //宣告BinaryReader用來寫入檔案
    using (var w = new BinaryWriter(fs, Encoding.UTF8, false))
    {
        //寫入不同資料型態的資料
        w.Write(1.250F);
        w.Write(@"c:\Temp");
        w.Write(10);
        w.Write(true);

        //寫入整數0~10
        for (int i = 0; i < 11; i++) {
            w.Write(i);
        }
    }
}

讀取檔案內容

  • BinaryReader:把指定的資料流(Stream)當成「二進位」值讀取。

BinaryReader 以特定的編碼方式,將基本資料型別當做二進位值讀取。

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
26
float aspectRatio;
string tempDirectory;
int autoSaveTime;
bool showStatusBar;

//宣告FileStream,來開啟test.txt的檔案資料流
using (var fs = new FileStream(@"C:\Users\rivalin\Desktop\test.txt", FileMode.Open))
{
    //宣告BinaryReader的方式讀取資料 (把資料流當作二進制值讀取)
    using (var reader = new BinaryReader(fs, Encoding.UTF8, false))
    {
        aspectRatio = reader.ReadSingle();
        tempDirectory = reader.ReadString();
        autoSaveTime = reader.ReadInt32(); //以整數方式讀取4bytes並傳回整數值,最後將指標往後移4bytes
        showStatusBar = reader.ReadBoolean(); //以布林值的方式讀取1byte並傳回,並將指標移到下一個byte

        for (int i = 0; i < 11; i++) {
            Console.Write(reader.ReadInt32());
        }
    }
}
Console.WriteLine(Environment.NewLine);
Console.WriteLine($"Aspect ratio set to: {aspectRatio}");
Console.WriteLine($"Temp directory is: {tempDirectory}");
Console.WriteLine($"Auto save time set to: {autoSaveTime}");
Console.WriteLine($"Show status bar: {showStatusBar}");

執行結果:

1
2
3
4
5
6
012345678910

Aspect ratio set to: 1.25
Temp directory is: c:\Temp
Auto save time set to: 10
Show status bar: True

什麼是 FileStream 檔案資料流(文件流)?

FileStream 和 File 區別

  • File - 提供建立、複製、刪除、移動和開啟檔案的靜態方法,並協助建立 FileStream 物件。
  • FileStream – 用於讀取和寫入檔案。

  • 要處理小文件用File就夠了
  • FileStream 操作位元組(byte)的,代表可以操作任何文件

  • File 是一下子都讀過來
  • FileStream 是一點一點讀過來,對內存來說比較沒有壓力

檔案資料流 FileStream 和 File類 讀取文件的時候,有什麼區別呢?

例如:兩個大水缸,如果我們把一個缸中的水倒入另一個水缸中,有兩種方式:

  • 直接把一個缸中的水舉起來倒入另一個缸中。 => File類
  • 用個桶來把一個缸中的水舀到另一個缸中。 => FileStream

File類 相當於第一種方式,FileStream相當於第二種方式。

我們在讀大數據的時候,最好是用第二種方式 FileStream去讀,對計算機的負荷比較小


File:

  • File類,是一個靜態類,支援對文件的基本操作,包括創建,拷貝,移動,刪除和打開一個文件。
  • File類別方法的參數很多時候都是路徑path。主要提供有關檔案的各種操作,在使用時需要引用System.IO命名空間。

FileStream:

  • FileStream 檔案資料流 只能處理原始位元組(raw byte)。
  • FileStream 類別可以用於任何資料文件,而不僅僅是文字文件。
  • FileStream 物件可以用於讀取諸如圖像和聲音的文件,
  • FileStream 讀取出來的是位元組陣列,然後透過編碼轉換將位元組數組轉換成字串。

區別:

  • file:是一個文件的類別,對文件進行操作的;
  • filestream:檔案資料流(文件流)。對txt, xml等文件寫入內容的時候需要使用的一個工具.

MSDN - 檔案和資料流 I/O
MSDN - BinaryReader 類別
MSDN - FileStream 類別
BinaryWriter和BinaryReader用法 [C# 筆記][FileStream] 文件流-複習 by R
[C# 筆記][FileStream] 使用 FileStream 來讀寫文件 by R
[C# 筆記][FileStream] 使用 FileStream 實現多媒體文件的複製 by R

This post is licensed under CC BY 4.0 by the author.