出于某些原因,我必须创建一个1024 kb的.txt文件。
以下是我目前的代码:
int size = 1024000 //1024 kb..
byte[] bytearray = new byte[size];
foreach (byte bit in bytearray)
{
bit = 0;
}
string tobewritten = string.Empty;
foreach (byte bit in bytearray)
{
tobewritten += bit.ToString();
}
//newPath is local directory, where I store the created file
using (System.IO.StreamWriter sw = File.CreateText(newPath))
{
sw.WriteLine(tobewritten);
}
我必须等待至少30分钟才能执行这段代码,我认为这段代码太长了。
现在,我想就如何有效地实现我提到的目标征求意见。有没有其他选择来完成这项任务?我写错了代码吗?任何帮助表示赞赏。
答案 0 :(得分:4)
将字符串替换为预先设置的StringBuilder
,以避免不必要的分配。
或者,更好的是,将每个部分直接写入StreamWriter
,而不是毫无意义地构建一个100MB的内存中的字符串。
答案 1 :(得分:4)
您提供的代码存在一些误解:
byte[] bytearray = new byte[size];
foreach (byte bit in bytearray)
{
bit = 0;
}
您似乎认为您正在使用零初始化数组bytearray
中的每个字节。相反,您只需将循环变量bit
(不幸的命名)设置为零size
次。实际上这个代码甚至不会编译,因为你不能分配给foreach迭代变量。
此外,您首先不需要初始化:字节数组元素自动初始化为0。
string tobewritten = string.Empty;
foreach (byte bit in bytearray)
{
tobewritten += bit.ToString();
}
您希望将数组中每个字节的字符串表示形式组合为字符串变量tobewritten
。由于字符串是不可变的,因此为每个必须进行垃圾收集的元素创建一个 new 字符串以及为bit
创建的字符串,这相对较贵,尤其是当您创建时2048000 其中之一 - 改为使用Stringbuilder
。
最后,根本不需要所有这些 - 似乎你只想在文本文件中写一堆“0”字符 - 如果你不担心创建一个大的零字符串(它取决于size
的值是否有意义)你可以just create the string directly做一次 - 或者多次将一个较小的字符串直接写入流中。
using (var file = File.CreateText(newpath))
{
file.WriteLine(new string('0', size));
}