首頁 > 軟體

C#中流的使用和分類

2022-07-31 18:01:04

使用流讀取、寫入檔案

使用流把檔案讀取到位元組陣列:

//FileMode.Create, FileMode.Append 
//FileAccess.Write, FileAccess.ReadWrite 
//FileMode和FileAccess搭配使用,如果第二個引數FileMode.Appden寫追加,第三個引數FileAccess.Read唯讀,會拋異常 
Stream source = new FileStream(@"1.jpg",FileMode.Open, FileAccess.Read) 
byte[] buffer = new byte[source.Length]; 
int bytesRead = source.Read(buffer, i, (int)source.Length);

Int32型別的最大值,以及Byte, KB, MB, GB轉換:

Int32.MaxValue = 2147483647 Byte 
2147483647/1024 = 2097152 KB(1 KB = 1024 Byte) 
2097152/1024 = 2048 MB(1 M = 1024 KB) 
2048/1024 = 2 G(1G = 1024M)

使用流把位元組陣列寫到檔案:

Stream target = new FileStream(@"2.jpg", FileMode.Create, FileAccess.Write);
 
Stream source = new FileStream(@"1.jpg",FileMode.Open, FileAccess.Read) 
byte[] buffer = new byte[source.Length]; 
int bytesRead = source.Read(buffer, i, (int)source.Length);
 
target.Write(buffer, 0, buffer.Length); 
source.Dispose(); 
target.Dispose();

使用流對大檔案進行分批讀取和寫入:

int BufferSize = 10240; // 10KB 
Stream source = new FileStream(@"D:a.mp3", FileMode.Open, FileAccess.Read); 
Stream target = new FileStream(@"D:b.mp3", FileMode.Create, FileAccess.Write);
 
byte[] buffer = new byte[BufferSize]; 
int byteRead; 
do{ 
    byteRead = source.Read(buffer, 0, BufferSize); 
    target.Write(buffer, 0, bytesRead); 
} while(byteRead > 0); 
target.Dispose(); 
source.Dispose();

流的分類

在Stream抽象類下包含:
→FileStream→IsolatedStoreageFileStream
→MemoryStream
→NetworkStream

基礎流

從流中讀取資料:

CanRead()
Read(byte[] buffer, int offset, int count)

向流中寫入資料:

CanWrite()
Write(byte[] buffer, int offset, int count)
WriteByte(Byte value)

移動流指標:

CanSeek()
Seek(long offset, SeekOrigion)
Position流的指標位置
Close()
Dispose()
Flush()將快取裝置寫入儲存裝置
CanTimeout()
ReadTimeout()
WriteTimeout()
Length
SetLength(long value)

裝飾器流

實現了Decorator模式,包含對Stream抽象基礎類別的參照,同時繼承自Stream抽象基礎類別。

  • System.IO.Compression下的DeflateStream和GZipStream用於壓縮和解壓縮
  • System.Security.Cryptography下的CryptoStream用於加密和解密
  • System.Net.Security下的AuthenticatedStream用於安全性
  • System.IO下的BufferedStream使用者快取

包裝器類

不是流型別,而是協助開發者處理流包含的資料,並且不需要將流讀取到Byte[]位元組陣列中。但流的包裝器類包含了對流的參照。

StreamReader

繼承自TextReader。
將流中的資料讀取為字元。

FileStream fs = new FileStream("a.txt", FileMode.Open, FileAcess.Read); 
StreamReader reader = new StreamReader(fs, Encoding.GetEncoding("GB2312"));
 
//或者 
//StreamReader reader = new StreamReader("a.txt"); //預設採用UTF-8編碼方式

StreamWriter

繼承自TextWriter。
將字元寫入到流中。

string text = 
@"aa 
bb 
cc";
 
StringReader reader = new StringReader(text); 
int c = reader.Read(); 
Console.Write((char)c);
 
char[] buffer = new char[8]; 
reader.Read(buffer, 0, buffer.Length); 
Console.Write(String.Join("",buffer));
 
string line = reader.ReadLine(); 
Console.WriteLine(line);
 
string rest = reader.ReadToEnd(); 
Console.Write(); 
reader.Dispose();

StringReader和StringWriter

也繼承自TextReader和TextWriter,但是用來處理字串。

BinaryWriter和BinaryReader

BinaryWriter用於向流中以二進位制方式寫入基元型別,比如int, float, char, string等.BinaryReader用於從流中讀取基元型別。注意,這2個類並不是繼承TextReader和TextWriter。

namespace ConsoleApplication29 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            Product p = new Product("product.bin") 
            { 
                Id = 1, 
                Name = "GOOD", 
                Price = 500F 
            }; 
            p.Save();
 
            Product newP = new Product("product.bin"); 
            newP.Load(); 
            Console.WriteLine(newP); 
            Console.ReadKey(); 
        } 
    }
 
    public class Product 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public double Price { get; set; }
 
        private string filePath;
 
        public Product(string filePath) 
        { 
            this.filePath = filePath; 
        }
 
        public void Save() 
        { 
            FileStream fs = new FileStream(this.filePath, FileMode.Create,FileAccess.Write); 
            BinaryWriter writer = new BinaryWriter(fs); 
            writer.Write(this.Id); 
            writer.Write(this.Name); 
            writer.Write(this.Price); 
            writer.Dispose(); 
        }
 
        public void Load() 
        { 
            FileStream fs = new FileStream(this.filePath, FileMode.Open,FileAccess.Read); 
            BinaryReader reader = new BinaryReader(fs); 
            this.Id = reader.ReadInt32(); 
            this.Name = reader.ReadString(); 
            this.Price = reader.ReadDouble(); 
            reader.Dispose(); 
        }
 
        public override string ToString() 
        { 
            return String.Format("Id:{0},Name:{1},Price:{2}", this.Id, this.Name, this.Price); 
        } 
    } 
}

結果:

編碼方式:
定義了位元組如何轉換成人類可讀的字元或者文字,可以看作是位元組和字元的對應關係表。在讀取檔案採用的編碼方式要和建立檔案採用的編碼方式保持一致。

幫助類

在System.IO名稱空間下。

  • File

FileStream fs = File.Create("a.txt");
Open(string path, FileMode mode)
OpenRead()
OpenWrite()
ReadAllText()
ReadAllByte()
WriteBllBytes()
WriteAllLines()
Copy(string sourceFileName, string destFileName)

  • FileInfo
  • Path
  • Directory
  • DirectoryInfo

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結


IT145.com E-mail:sddin#qq.com