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

时间:2018-11-28 02:39:11

标签: c# readfile eof

我具有将一些数据写入二进制文件的功能

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

有人可以帮忙吗? 预先感谢

1 个答案:

答案 0 :(得分:1)

JSON可以不带格式(没有新行)的形式保存,因此您可以在文件的每一行中保存1条记录。因此,我建议的解决方案是忽略二进制文件,而使用常规的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进行比较。