使用filestream和streamreader读取c#中的文件

时间:2015-05-22 21:38:42

标签: c# byte filestream streamreader readline

我有一个文件,其中包含数据,我想将其读作byte []并分成3个块。第一行可能被读作字符串,然后是第二个块,可能是1-3行的长度,所有左边的字节都是块3。

我想知道,我怎么能得到那个块1,而块2将是一个由byte []组成的字符串,块3将保留为byte []。

文件:

00256000 12      // block 1 single line
a2#b2#c2#d2#e2#  //
1#               //  block 2 readline doesn't fit, unknown length of lines
1#               //
—q3л             // block 3 left bytes

我试图做FileStream.Read(bytes,0,file.length),但它只读取所有字节。

StreamReader.ReadLine()仅适用于第一行,但它读取普通字符串,而不是字节,它会跳过'\ n','\ r'等。

我不知道哪种方式更好地读取文件,读取所有字节并以某种方式将它们分成这3个块是完美的,以获得精确的块大小。

3 个答案:

答案 0 :(得分:1)

您可以读取所有字节并迭代缓冲区搜索行结尾。当你找到行结尾转换textparts

string text = Encoding.UTF8.GetString(buffer, start_len, end_len);

P.S。一定要使用精确编码...... UTF8就是一个例子......

答案 1 :(得分:0)

创建一个包含所需数据成员的类,将其标记为serializable,然后序列化数据(即将其保存到文件中),并在需要数据时对其进行反序列化。

[Serializable()]
public class Data1
{
    public Data1()
    {
    }

    public String[] Block { get; set; }
}

要在保存数据后加载该数据,请使用以下技术:

public Data1 Load(string filename)
{
    if (System.IO.File.Exists(filename))
    {
        using (var stream = System.IO.File.OpenRead(filename))
        {
            var deserializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            return deserializer.Deserialize(stream) as Data1;
        }
    }
    return null;
}
但是,我不会为你做到这一切!您需要了解如何序列化 Data1 的实例。

答案 2 :(得分:0)

读取小文件有非常方便的方法,它返回行数组。

string[] lines = File.ReadAllLines("filename");