Windows Phone中Stream和Buffer類讀寫操作(不僅僅是文本文件)

FileIO.ReadTextAsync(file)

FileIO.WriteTextAsync(file)

StreamReader和StreamWriter類

以上都是基於操作的是文本內容的文件,而如果操作圖片文件或者其他二進制文件就需要操作文件的Stream和Buffer

數據了。

操作這種二進制的文件,需要用到DataWriter類和DataReader類,前者用於寫入文件信息,各種類型的數據信息都

可以進行寫入(包括文本信息),後者用於讀取文件內容。


1.  Buffer類寫入操作

文件的Buffer操作使用的是IBuffer對象,所以需使用DataWriter類寫入相關信息之後再轉化爲IBuffer對象,然後保存

到文件中。其中相關信息指先寫入信息的長度(類型可能是Int32),然後寫入具體的信息內容等等,總而言之就是這個

文件組成的各個部分,簡言之就是讀寫規則:需要先寫入什麼,後寫入什麼,與之對應的就需要先讀取什麼,後讀取

什麼,如果一味的用讀取字符串的方式讀取,那麼就讀取不到信息長度,進而就無法讀取整個文件,這也是爲什麼利

用StreamReader.ReadToEnd()無法讀取除了文本文件以外的文件的原因。

using(InMemoryRandomAccessStream memoryStream = new InMemoryRandomAccessStream())
{
    using(DataWriter dataWriter = new DataWriter(memoryStream))
    {
        //文件相關信息,根據文件規則進行寫入
        dataWriter.WriteInt32(size);
        dataWriter.WriteString(Content);
        ...
        IBuffer buffer = dataWriter.DetachBuffer();
    }
}
await FileIO.WriteBufferAsync(file, buffer);

2. Buffer的讀取操作

讀取操作就是獲取文件的IBuffer對象之後再使用IBuffer對象初始化一個DataReader對象,然後就可以對文件進行讀

取操作了。

IBuffer buffer = await FileIO.ReadBufferAsync(file);
using(DataReader dataReader = DataReader.FromBuffer(buffer))
{
    //讀取文件相關信息,讀取的規則和文件的規則一致
    Int32 stringSize = dataReader.ReadInt32();
    string fileContent = dataReader.ReadString((uint)stringSize);
    ...
}


3. Stream的寫入操作

文件的Stream其實就是文件內容的信息,所以在用Stream來寫入文件的數據的時候,直接保存Stream的信息即可,

不需要再調用文件的對象進行保存。

using(StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync())
{
    using(DataWriter dataWriter = new DataWriter(transaction.Stream))
    {
        //文件的相關信息,根據文件的規則寫入
        dataWriter.WriteInt32(size);
        dataWriter.WriteString(content);
        ...
        transaction.Stream.Size = await dataWriter.StoreAsync();
        //保存Stream數據
        await transaction.CommitAsync();
    }
}

4. Stream的讀取操作

使用Stream讀取文件的內容,需要先調用DataReader類的LoadAsync()方法,將數據加載進來,在調用相關的Read

方法讀取文件的內容。而可以注意到之前Buffer讀取操作沒有調用DataReader的LoadAsync()方法,這是因爲它已經

一次性的將數據讀取出來了(DataReader.FromBuffer(buffer))。

using(IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read))
{
    using(DataReader dataReader = new DataReader(readStream))
    {
        //讀取文件相關信息,根據文件規則讀取
        await dataReader.LoadAsync(sizeof(Int32));
        Int32 stringSize = dataReader.ReadInt32();
        await dataReader.LoadAsync((UInt32)stringSize);
        string content = dataReader.ReadString((uint)stringSize);
        ...
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章