如何在C#中读取二进制文件直到EOF

3
我有一个函数可以将一些数据写入二进制文件。
private void writeToBinFile (List<MyClass> myObjList, string filePath)
{
    FileStream fs = new FileStream(filePath, FileMode.Create);
    BinaryWriter bw = new BinaryWriter(fs);

    foreach (MyClass myObj in myObjList)
    {
        bw.Write(JsonConvert.SerializeObject(myObj));
    }
    bw.Close();
    fs.Close();

}

我正在寻找类似于

FileStream fs = new FileStream(filePath, FileMode.Create);
BinaryReader bw = new BinaryReader(fs);

while (!filePath.EOF)
{
    List<MyClass> myObjList = br.Read(myFile);
}

有人能帮忙吗?谢谢提前。

2
bw.Write(JsonConvert.SerializeObject(myObj)); 嗯,抱歉问个愚蠢的问题。为什么要使用二进制写入来转储JSON字符串呢..?最好不是做一些 JsonConvert.SerializeObject(myObjList) 的事情,然后将它们作为字符串读回来,并将字符串传递给 JsonConvert.DeserializeObject<MyClass>(myString) 吗? - Bagus Tesa
1
我想你已经使用过 BinaryWriter 来写入你的 JSON,以便你有单独的记录。更好的方式(如果你想要 JSON)是让文件的每一行都有一个 JSON 对象,然后你就可以使用普通的 StreamReader 了。如果你希望我加上这样的答案,请告诉我。 - ProgrammingLlama
嗨,我是C#的新手,我尝试了bw.Write(myObj);但是出现了错误,说无法将myObj转换为bool。 - noobDev
@noobDev 好的,但是二进制文件通常不可读。JSON 是可读的,所以混合使用二进制和 JSON 似乎有点奇怪。 - ProgrammingLlama
是的 @John 非常感谢你 - noobDev
1个回答

2

JSON可以没有格式(没有换行符)保存,因此您可以将每个记录保存为文件的一行。因此,我建议的解决方案是忽略二进制文件,而使用常规的StreamWriter:

private void WriteToFile(List<MyClass> myObjList, string filePath)
{
    using (StreamWriter sw = File.CreateText(filePath))
    {
        foreach (MyClass myObj in myObjList)
        {
            sw.Write(JsonConvert.SerializeObject(myObj, Newtonsoft.Json.Formatting.None));
        }
    }
}

private List<MyClass> ReadFromFile(string filePath)
{
    List<MyClass> myObjList = new List<MyClass>();
    using (StreamReader sr = File.OpenText(filePath))
    {
        string line = null;
        while ((line = sr.ReadLine()) != null)
        {
            myObjList.Add(JsonConvert.DeserializeObject<MyClass>(line));
        }
    }
    return myObjList;
}

如果您真的想使用二进制编写器来保存JSON,您可以将其更改为以下内容:
private void WriteToBinFile(List<MyClass> myObjList, string filePath)
{
    using (FileStream fs = new FileStream(filePath, FileMode.Create))
    using (BinaryWriter bw = new BinaryWriter(fs))
    {
        foreach (MyClass myObj in myObjList)
        {
            bw.Write(JsonConvert.SerializeObject(myObj));
        }
    }
}

private List<MyClass> ReadFromBinFile(string filePath)
{
    List<MyClass> myObjList = new List<MyClass>();
    using (FileStream fs = new FileStream(filePath, FileAccess.Read))
    using (BinaryReader br = new BinaryReader(fs))
    {
        while (fs.Length != fs.Position) // This will throw an exception for non-seekable streams (stream.CanSeek == false), but filestreams are seekable so it's OK here
        {
            myObjList.Add(JsonConvert.DeserializeObject<MyClass>(br.ReadString()));
        }
    }
    return myObjList;
}

注意:

  • 我已经在你的流实例周围添加了using,以便在内存释放时正确关闭文件。
  • 要检查流是否到达末尾,您必须将LengthPosition进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接