0

我使用 TextWriter C# 创建了一个文本文件,在最终创建时,该文本文件通常在文件末尾有各种空白行。构成文件的任何字符串对象中都不包含空格,我不知道是什么原因造成的。文件越大,空白越多。

我尝试了各种测试来查看空格是否基于字符串上的内容出现,但事实并非如此。即我已经确定了空格开始的行数,并将字符串更改为完全不同的内容,但空格仍然存在。

//To start:
MemoryStream memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

//Loop through records & create a concatenated string object
string strUTL1 = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}", strUTL1_1, strUTL1_2, strUTL1_3, strUTL1_4, strUTL1_5, strUTL1_6, strUTL1_7, strUTL1_8);

//Add the line to the text file
tw.WriteLine(strUTL1);

//Once all rows are added I complete the file
tw.Flush();
tw.Close();


//Then return the file
return File(memoryStream.GetBuffer(), "text/plain", txtFileName);

我不想在完成后操作文件(例如替换空格),因为这可能会导致其他问题。该文件将与第三方交换,需要准确格式化。

谢谢您的帮助。

4

3 回答 3

3

正如文档MemoryStream.GetBuffer解释的那样:

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,其中 252 个字节未使用。要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 会在内存中创建数据的副本。

使用.ToArray()(这将分配一个正确大小的新数组),或者您可以使用从返回的缓冲区,.GetBuffer()但您需要检查.Length以查看其中有多少有效字节。

于 2019-08-28T10:19:28.310 回答
1

GetBuffer()返回所有已分配的内存,这几乎总是比您实际写入的字节多。

我可以建议Encoding.UTF8.GetBytes(...)改用:

string strUTL1 = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}", strUTL1_1, strUTL1_2, strUTL1_3, strUTL1_4, strUTL1_5, strUTL1_6, strUTL1_7, strUTL1_8);

var bytes = Encoding.UTF8.GetBytes(strUTL1);

return File(bytes, "text/plain", txtFileName);
于 2019-08-28T10:26:42.113 回答
0

使用ToArray()代替GetBuffer(),因为缓冲区比需要的大。

情况往往如此。使用缓冲区的类或函数通常会保留一定大小的内存来保存数据。然后该函数将返回一个值,即已将多少字节写入缓冲区。然后,您将只使用缓冲区的前n个字节。

引用 MSDN:

例如,如果将字符串“test”写入 MemoryStream 对象,则 GetBuffer() 返回的缓冲区长度为 256,而不是 4,其中 252 个字节未使用。要仅获取缓冲区中的数据,请使用 ToArray() 方法;但是, ToArray() 在内存中创建数据的副本。

于 2019-08-28T10:19:27.543 回答