C# 将流写入文件和内存
我试图读取一个EmbeddedResource(默认配置文件)并将其写入一个文件。之后,我应该阅读文件,并使事情更容易,我决定这样做,在一个单一的步骤C# 将流写入文件和内存,c#,stream,json.net,C#,Stream,Json.net,我试图读取一个EmbeddedResource(默认配置文件)并将其写入一个文件。之后,我应该阅读文件,并使事情更容易,我决定这样做,在一个单一的步骤 private string CreateDefaultFile() { using (var stream = Shelter.Assembly.GetManifestResourceStream($@"Mod.Resources.Config.{_file}")) { i
private string CreateDefaultFile()
{
using (var stream = Shelter.Assembly.GetManifestResourceStream($@"Mod.Resources.Config.{_file}"))
{
if (stream == null)
throw new NullReferenceException(); //TODO
using (var ms = new MemoryStream())
{
using (var fs = new FileStream(Shelter.ModDirectory + _file, FileMode.Create, FileAccess.Write, FileShare.Read))
{
byte[] buffer = new byte[512];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
fs.Write(buffer, 0, bytesRead);
}
fs.Flush();
ms.Flush();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
}
这确实创建了文件,但返回值似乎没有正常工作。内容似乎正确,但JSON.Net无法解析它,出现以下错误:
JsonReaderException:分析值时遇到意外字符:。路径“”,第0行,位置0。
。使用File.ReadAllText(…)
而不是Encoding.UTF8.GetString(ms.ToArray())
似乎有效,所以我猜这是如何将流加载到字符串中的问题
此外,分块部分是不需要的,因为文件的大小很小,我在多个地方读过,这是更好的使用,所以我更喜欢它
(目标是.netframework3.5
)感谢评论,我解决了这个问题
守则:
private string CreateDefaultFile()
{
using (var stream = Shelter.Assembly.GetManifestResourceStream($@"Mod.Resources.Config.{_file}"))
{
if (stream == null)
throw new NullReferenceException(); //TODO
using (var ms = new MemoryStream())
{
using (var fs = File.Open(Shelter.ModDirectory + _file, FileMode.Create, FileAccess.Write, FileShare.Read))
{
byte[] buffer = new byte[512];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
fs.Write(buffer, 0, bytesRead);
}
fs.Flush();
ms.Flush();
byte[] content = ms.ToArray();
if (content.Length >= 3 && content[0] == 0xEF && content[1] == 0xBB && content[2] == 0xBF)
return Encoding.UTF8.GetString(content, 3, content.Length - 3);
return Encoding.UTF8.GetString(content);
}
}
}
}
因此,如果您使用Debug.WriteLine或类似工具打印返回值,那么内容看起来合理吗?如果JSON位也引起错误,我们可能还应该看到它。如果文件内容很小,您是否可以将其添加到问题中(编辑任何机密)返回值是一个json字符串,并且打印它时显示的内容与
json数据
link@Damien\u相同?您的字节数组必须在开头有一个。要正确处理它,请使用StreamReader
,如和所示。