【问题标题】:StreamWriter is writing a weird line at the end of a fileStreamWriter 在文件末尾写了一个奇怪的行
【发布时间】:2019-12-14 03:11:44
【问题描述】:

我正在使用 StreamWriter 将字符串写入内存,然后通过 ASP.Net Core Web API 中的 IActionResult 将其作为文件返回,我遇到了一个奇怪的问题,我得到了一条线输出文件末尾的难以辨认的字符......

这是我正在谈论的图像:

第 513 行的文本不应该在那里...我认为它与编码有关,但我对编码或文本了解不多,所以我希望有更多知识的人可以帮帮忙……

这是我的代码:

    [HttpGet("download/{fileId}")]
    public IActionResult DownloadFile(int fileId)
    {
        if (!_fileRepository.FileExists(fileId))
            return NotFound();

        var file = _fileRepository.GetFile(fileId);

        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        string BAIFile = ParseModelToFile(file);

        using (MemoryStream ms = new MemoryStream())
        {
            using (var sw = new StreamWriter(ms, new UnicodeEncoding()))
            {
                sw.Write(BAIFile);
                sw.Flush();
                sw.Close();

                return File(ms.GetBuffer(), "text/plain", DateTime.Now.ToShortDateString() + ".BAI");
            }
        }
    }

【问题讨论】:

  • Read first paragraph 解释您的问题并为您提供解决方案。
  • 另一方面,您可以避免所有这些,而不是再次处理当前数组或使用流,只需调用 return File(Encoding.UTF8.GetBytes(BAIFile), "text/plain" 等...

标签: c# asp.net-core .net-core


【解决方案1】:

为了性能,MemoryStream 尝试限制它调整其内部缓冲区大小的频率。因此,它的作用是,每次写入时,如果它需要扩展其存储容量,它将调整该容量的大小超过所需的容量。这样,下一次写入也不应该导致调整大小。

这意味着,例如,它的缓冲区可能是 2048 字节,而您的实际内容只有 1900 字节。最后 148 个字节?这就是你看到的垃圾。

您将获得 整个 缓冲区,实际上它比您的实际内容更长。请改用ToArray()。这将返回缓冲区的副本,其中仅包含您的实际内容,而不是剩余的额外空间。

【讨论】:

  • @BrandonMiller 不客气。你可以看到这一点。在变量中同时获取ToArray()GetBuffer() 并查看它们的大小。然后查看内存流的LengthCapacity 属性。你会看到一个模式。
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 2021-11-13
  • 2012-07-19
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2017-08-16
  • 2012-06-10
相关资源
最近更新 更多