【问题标题】:MemoryStream cannot be expanded...refactoring from FileStream to MemoryStream or similarMemoryStream 无法扩展...从 FileStream 重构为 MemoryStream 或类似
【发布时间】:2014-11-13 17:35:04
【问题描述】:

我在重构一段代码时遇到问题。我模糊地理解了这个问题,但多一点洞察力和/或解释对我理解和解决问题很有帮助。

首先是原始代码块:

FileStream fS = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite);
Int64 fSLength = fS.Length;
Int64 remainingNotFulEncDecBlock = fSLength % 1;
fS.Seek(0, SeekOrigin.End);
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock;

Byte fillByte = (Byte)'$';

  for (Int32 i = 0; i < nrBytesToAdd - 1; i++)
    fS.WriteByte(fillByte);
    fS.WriteByte((Byte)nrBytesToAdd);
    fSLength = fS.Length;
    fS.Close();

重构的唯一目的是我们不再需要打开物理文件。相反,我们提供byte[]

这是我重构的代码:

MemoryStream fS = new MemoryStream(_data);
Int64 fSLength = fS.Length;
Int64 remainingNotFulEncDecBlock = fSLength % 1;
fS.Seek(0, SeekOrigin.End);
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock;

Byte fillByte = (Byte)'$';
  for (Int32 i = 0; i < nrBytesToAdd - 1; i++)
    fS.WriteByte(fillByte);
    fS.WriteByte((Byte)nrBytesToAdd);
    fSLength = fS.Length;
    fS.Close();

上面的代码产生错误MemoryStream不能展开就行了

fS.WriteByte((Byte)nrBytesToAdd);

最初我不得不用谷歌搜索错误并阅读。现在这很有意义,因为内存流已设置为特定大小。我不清楚的是我应该如何进行。我是否要创建另一个未设置为特定大小的 MemoryStream 对象,从而允许我执行以下操作:

MemoryStream ms = new MemoryStream();
ms.WriteByte((Byte)nrBytesToAdd);

我对这种技术的阅读表明,这比将MemoryStream 初始化为指定的byte[] 性能要差,但是我不知道(找不到)另一种动态扩展MemoryStream 的方法。一个优点是现在和在可预见的将来,byte[] 的数量将非常小,因此虽然速度较慢,但​​可能不会对性能产生重大影响。

【问题讨论】:

  • A MemoryStream 可以调整大小,只要您不使用特定的 byte[] 缓冲区对其进行初始化(即,以除了您在此处使用它的方式之外的任何方式使用它)。但是您发布的代码意义不大,很难知道正确的答案是什么。 fsLength % 1 总是返回 0,那何必呢?鉴于此,您的循环如何做任何事情,因为 nrBytesToAdd 始终为 1,因此 i &lt; nrBytesToAdd - 1 始终为假。如果您想为您的问题提供真正有用的答案,您应该发布一个很好的代码示例。见stackoverflow.com/help/mcve

标签: c# arrays stream


【解决方案1】:

您可以使用获取初始容量的 MemeoryStream constructor

MemoryStream fS = new MemoryStream(_data.Length);

这将设置该大小的内部字节数组,因此内存流不必在每次达到其大小限制时继续扩展数组。它将允许您将字节添加到内存流中。虽然不如仅使用静态 byte[] 大小有效,但它可能是下一个最好的选择。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多