用c#将字节流写入文件的有效方法是什么?
本文关键字:有效 方法 是什么 文件 字节流 | 更新日期: 2023-09-27 18:18:22
我有大约5GB字节的大数据
我需要将这些数据存储在文件ServerData.xml
中。这些数据应该先转换成字符串,然后保存到文件中,以便我们可以对文件进行操作。
我使用下面的代码将字节流转换为字符串,然后将其保存在文件中。
private const string fileName = "ServerData.xml";
public void ProcessBuffer(byte[] receiveBuffer, int bytes)
{
if (!File.Exists(fileName))
{
using (File.Create(fileName)) { };
}
TextWriter tw = new StreamWriter(fileName, true);
tw.Write(Encoding.UTF8.GetString(receiveBuffer).TrimEnd((Char)0));
tw.Close();
}
这是正确的方式吗?
或者请建议更好的方法,以便将来不会有任何内存问题
您的问题中的代码只能在ProcessBuffer
总是使用在代码点边界上被打破的UTF-8编码文本调用时才能工作。这对我来说似乎不太可能,所以我希望您在解码文本时遇到错误。
然而,解码成文本然后再写入,是相当没有意义的,而且确实适得其反。字节已经是UTF-8编码。当它们从套接字到达时直接写入文件。不要对它们进行任何处理。当您使用XmlReader
读取XML时,解析器将从文档的XML声明中读取编码为UTF-8,并能够解码文档的其余部分。我假设文档的XML声明指定了UTF-8,但这似乎很有可能。你应该检查一下。
你应该摆脱文本写入器,它对你写字节没有用处。将字节直接写入文件流。并尽量避免反复打开和关闭文件。这是非常低效的。打开和关闭该文件一次。
为什么需要将其转换为字符串?
using System.IO;
public static void WriteBytes(byte[] bytes, string filename)
{
using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate))
using (BinaryWriter writer = new BinaryWriter(fs, Encoding.UTF8))
{
writer.Write(bytes);
}
}
您可以简单地使用FileStream
将这些字节写入文件:
public void ProcessBuffer(byte[] receivedBuffer, int bytes)
{
using (var fileStream = new FileStream(fileName, FileMode.Create)) // overwrites file
{
fileStream.Write(receivedBuffer, 0, bytes);
}
}
更新:如果没有足够的资源,您将无法处理如此大的XML文档。我建议重新格式化这个文件。例如,我将解析这个XML并将数据插入SQL数据库。然后,您可以轻松地操作这些数据量。
我更愿意将所有字节写入文件。读取时,将其转换为字符串,然后使用XDocument, XElement等转换为XML。通过在文件中写入字节,您将节省空间,而且效率很高,
不使用FileStream,我更喜欢File。WriteAllBytes方法。
private const string fileName = "ServerData.xml";
public void ProcessBuffer(byte[] receiveBuffer, int bytes)
{
File.WriteAllBytes(filename, bytes);
// And when reading
var bytes = File.ReadAllBytes(filename);
var binaryReader = new BinaryReader(new MemoryStream(bytes));
// Parse strings and make xml,
binaryReader.ReadString();
}