Windows Phone中Stream和Buffer类读写操作(不仅仅是文本文件)

来源:互联网 发布:爬虫软件刷奖软件下载 编辑:程序博客网 时间:2024/06/06 20:02

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);
        ...
    }
}
0 0