【问题标题】:Output stream writing more that read - C#输出流写入比读取更多 - C#
【发布时间】:2014-01-02 17:42:57
【问题描述】:

我有一个脑死亡的时刻,现在茫然地盯着这小段代码 10 分钟...有人可以告诉我为什么输出文件 (test2.txt) 包含比它正在阅读的文件更多的文本来自 (test.txt) ??

代码如下:

FileStream inputStream = new FileStream(@"C:\Temp\test.txt", FileMode.Open);
FileStream outputStream = new FileStream(@"C:\Temp\test2.txt", FileMode.OpenOrCreate);
byte[] buffer = new byte[1024];

Console.WriteLine(new FileInfo(@"C:\Temp\test.txt").Length + "\n");

while (inputStream.Read(buffer, 0, buffer.Length) > 0)
{
      Console.WriteLine("bufferlength " + buffer.Where(x => x != 0).ToArray().Length);
      Console.WriteLine(new FileInfo(@"C:\Temp\test2.txt").Length);
      outputStream.Write(buffer, 0, buffer.Length);
      outputStream.Flush();
      Console.ReadKey();
}

Console.WriteLine("\n" + inputStream.Length);
Console.WriteLine(outputStream.Length);
Console.Read();

谢谢大家

【问题讨论】:

  • Rohit Vats 有您可以使用的答案。请记住,当这是一个大文件时,不断写入Console 可能会花费很长时间。此外,我会增加缓冲区大小以减少因开销造成的损失。

标签: c# .net stream filestream


【解决方案1】:

这是因为您创建了一个大小为 1024 的字节数组。因此,即使 inputStream 长度小于 1024,它仍会向您的文件写入 1024 个字节。

您应该使用 inputStream 大小对其进行初始化,以便仅将有限的字节写入您的文件:

byte[] buffer = new byte[inputStream.Length];

更新

Silvermind 在评论中指出正确,让缓冲区数组大小为 1024。而不是 use byte size returned by Read 方法写入您的文件,以便只有读取的字节被写入文件:

int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
    Console.WriteLine("bufferlength " + buffer.Where(x => x != 0)
                                                  .ToArray().Length);
    Console.WriteLine(new FileInfo(@"D:\Temp\test2.txt").Length);
    outputStream.Write(buffer, 0, bytesRead); <- HERE
    outputStream.Flush();
}

在旁注中,您应该在使用后dispose FileStream's 以避免任何内存泄漏。您可以wrap them in using block使用后自动为您处理。

using (FileStream inputStream = new FileStream(@"C:\Temp\test.txt",
                                                 FileMode.Open))
{
    using (FileStream outputStream = new FileStream(@"C:\Temp\test2.txt",
                                                      FileMode.OpenOrCreate))
    {
        byte[] buffer = new byte[inputStream.Length];
        Console.WriteLine(new FileInfo(@"C:\Temp\test.txt").Length + "\n");
        int bytesRead;
        while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            Console.WriteLine("bufferlength " + buffer.Where(x => x != 0)
                                                  .ToArray().Length);
            Console.WriteLine(new FileInfo(@"D:\Temp\test2.txt").Length);
            outputStream.Write(buffer, 0, bytesRead); <- HERE
            outputStream.Flush();
         }
        Console.WriteLine("\n" + inputStream.Length);
        Console.WriteLine(outputStream.Length);
    }
}

【讨论】:

  • 啊,我明白了。谢谢楼主
  • 欢迎黎明冻结。如果您的问题得到解决,请接受答复。
  • 也许这是一个大文件?现在您将整个文件放入内存中。我的猜测是 Read 返回一个 int 读取了多少字节并且他可以使用它。
  • @Silvermind - 是的,你是对的。更新了答案.. 谢谢.!!
  • 谢谢大家,非常感谢。
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2017-06-09
相关资源
最近更新 更多