【问题标题】:Is there a restriction on the amount of text I can write / read with a stream writer / reader in C#?在 C# 中使用流写入器/读取器可以写入/读取的文本量是否有限制?
【发布时间】:2011-08-29 00:26:43
【问题描述】:

我正在尝试使用流写入器写入一些文本文件。 我要写的文本来自不同的文本文件。

我试试:

string line = reader.ReadLine(); //reader is a streamReader I defined before
while (line != null)
{
    sw.WriteLine(line); //sw is a streamWriter I defined before
    line = reader.ReadLine();
}

我也试过了:

while (!(reader.EndOfStream))
{
    sw.WriteLine(reader.ReadLine()); //sw is a streamWriter I defined before
}

这两种方法成功地将文本从文件复制到另一个文件,但由于某种原因,并非所有文本都被复制。 我试图从中复制的文本文件非常大,大约 96000 行,并且只复制了 ~95000 的第一行。

因此,我想问在 C# 中使用流写入器/读取器可以写入/读取的文本量是否有限制?

另外,我请求一些关于如何成功复制所有文本的建议。 (我读到有一个 Stream 类的方法副本,但那是针对 .NET4 的,所以没有帮助)。

编辑:我试图将未复制的文本替换为已复制开头的文本。我遇到了同样的问题,所以这不是字符的问题。

【问题讨论】:

  • 我也有同样的想法,源文件中可能有一些奇怪的二进制字符导致提前终止。
  • 根据你有多少 RAM 肯定有一个限制,但我不知道 c# 将你的缓冲区大小限制在什么范围内。我也会把你指向这里stackoverflow.com/questions/1249475/…
  • 你怎么知道不是每一行都被复制了?您只是比较文件大小,还是使用了 diff 工具?
  • 这些是文本文件。我只是用记事本++打开它们并根据我所看到的进行比较。
  • 请在问题中查看我的编辑。

标签: c# stream filestream streamreader streamwriter


【解决方案1】:

嗯。可能你没有刷新你的流。尝试做 sw.Autoflush=true;或者,在关闭 sw 之前,调用 sw.Flush();

【讨论】:

  • 谢谢。问题是我没有关闭流。我添加了关闭并解决了它。之后我添加了冲洗,它也可以正常工作。同花顺到底在做什么?
  • 为了提高写入效率,每次调用 Write 时流不一定会立即写入磁盘。它将在内存中缓冲写入,然后缓冲区足够大,一次将它们写入磁盘。调用 flush 确保写入到磁盘。当然,调用 close 也可以很好地将所有字节写入磁盘,但这并不一定能保证。
  • 谢谢。所以,如果我理解正确,冲洗总是更好?或者有时出于某种原因最好不使用它?我的意思是除了效率
  • 您应该始终在关闭流之前调用它。或者,正如我所说,您可以将 Autoflush 设置为 true,然后每次写入时,它也会为您调用 flush。据我所知,除了效率之外没有其他原因,除了您可能必须立即将写入刷新到磁盘,因为它是任务关键型软件。
【解决方案2】:

我猜你没有在你的输出流上调用flush。这会导致最后几行(有时很多行)不写入输出文件。

【讨论】:

  • 有时我认为您在输入答案时应该能够看到其他人在输入什么。 :)。当我在发布我的帖子后看到您的答案时,我实际上想了一秒钟我双张贴。 :)
猜你喜欢
  • 2020-08-08
  • 2011-11-21
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2015-07-26
相关资源
最近更新 更多