【发布时间】:2016-02-15 11:10:03
【问题描述】:
我有点困惑,我应该如何按块读取大文件(> 8GB),以防每个块都有自己的大小。
如果我知道块大小,它看起来像下面的代码:
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, ProgramOptions.BufferSizeForChunkProcessing))
{
using (BufferedStream bs = new BufferedStream(fs, ProgramOptions.BufferSizeForChunkProcessing))
{
byte[] buffer = new byte[ProgramOptions.BufferSizeForChunkProcessing];
int byteRead;
while ((byteRead = bs.Read(buffer, 0, ProgramOptions.BufferSizeForChunkProcessing)) > 0)
{
byte[] originalBytes;
using (MemoryStream mStream = new MemoryStream())
{
mStream.Write(buffer, 0, byteRead);
originalBytes = mStream.ToArray();
}
}
}
}
但是想象一下,我已经逐块读取大文件,并对每个块进行了一些编码(更改该操作后的块大小)并将所有已处理的块写入另一个新文件。而现在我需要做相反的操作。但我不知道确切的块大小。我有个主意。在处理完每个块之后,我必须在块字节之前写入新的块大小。像这样:
Number of block bytes
Block bytes
Number of block bytes
Block bytes
所以在这种情况下,首先我需要做的是读取块的标题并准确了解块大小。我只读取和写入文件字节数组。但我有一个问题 - 应该如何看待块的标题?可能标题必须包含一些边界?
【问题讨论】:
-
被标记为重复 - 看看这个你应该能够得到答案的地方stackoverflow.com/questions/17612853/…
-
但我必须使用
BufferedStream。我不能使用StreamReader -
您意识到
FileStream已经缓冲了文件,所以使用BufferedStream毫无意义? -
BufferedStream(如FileStream)是Stream,而StreamReader从Stream读取,所以如果你必须使用它就不会意味着你不能使用另一个。