在使用.NET CF的Windows CE设备上。我在REST服务的流中收到一个大文件(12MB)。
这个大文件是base64格式,但它有两个小细节,内容用双引号("
)包围,每N个字符都有一个\\n
(不是换行符{{ 1}},但实际的2个字面字符)。
所以我需要做的是,删除引号以及\n
或用实际换行符替换它们。并且还从base64格式转换。
这是我的代码:
\\n
但是使用此代码,当我调用var input = ApplicationContext.restProxy.GetData();
using (StreamReader sr = new StreamReader(input))
{
StringBuilder sb = new StringBuilder();
char[] buffer = new char[32];
while (sr.Read(buffer, 0, 32) > 0)
{
var s = new string(buffer);
s = s.Replace("\\n", "\n");
s = s.Trim('"');
sb.Append(s);
}
byte[] fileBytes = Convert.FromBase64String(sb.ToString());
}
时,我要么有OutOfMemoryException
,要么FormatException
。
某些输入数据具有以下格式:
Convert.FromBase64String
如何在不填满设备内存的情况下执行这些操作,或者生成的字符串格式有什么问题?
答案 0 :(得分:1)
如果您写入逐个字符检查的缓冲区,则可以获得更好的结果。
此外,由于文件太大,您可以通过将此数据直接写入输出文件来获得更好的结果。否则,您试图将所有这些数据保存在内存中。
将输出直接发送到文件可能会解决这个问题,但我不知道。我从来没有遇到过,所以我不知道如何测试它。
以下是一个可以解决您的问题的示例方法:
private void ReadData(Stream input) {
using (StreamReader sr = new StreamReader(input)) {
using (StreamWriter sw = new StreamWriter(File.Create("outfile.dat"))) {
char[] buffer = new char[32];
while (-1 < sr.Peek()) {
int len = sr.Read(buffer, 0, 32);
List<char> output = new List<char>();
for (int i = 0; i < len; i++) {
char c = buffer[i];
if ((c != '\\') && (c != '\n')) {
output.Add(c);
}
}
sw.Write(output.ToArray());
}
sw.Flush();
sw.Close();
}
sr.Close();
}
}
虽然不需要Close()
,但我发现在垃圾收集器有机会为您清理之前,您可以多次调用某种方法会有所帮助。安全起见会更好。
我希望它提供一些用途。