我的HD上有一个大约1 GB的文件。我想把这个文件读成一个字节数组。问题是Visual Studio正在抛出'System.OutOfMemoryException'。有没有办法在字节数组中处理这么大的文件?我需要在字节数组上,因为我想将数据附加到文件的特定部分,然后将附加数据写回我的HD。
谢谢你, 埃文
答案 0 :(得分:3)
您不应该立即将整个文件读入Byte数组。以块的形式阅读文件
InputStream is = new FileInputStream(some file);
// Create the byte array to hold the data
byte[] bytes = new byte[Somelength];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0)
{
offset += numRead;
//do whatever you want do do with byes
}
// Ensure all the bytes have been read in
if (offset < bytes.length)
{
throw new IOException("Could not completely read file "+file.getName());
}
答案 1 :(得分:1)
如果您需要将数据插入文件的中间,我建议您创建一个 new 文件。在从原始文件复制数据和插入新数据之间交替。一次不需要在内存中占用太多。
复制特定的“块”应该简单如下:
public static void CopyChunk(Stream input, Stream output, int size)
{
byte[] buffer = new byte[16 * 1024];
while (size > 0)
{
int bytesRead = input.Read(buffer, 0, Math.Min(size, bufer.Length));
if (bytesRead == 0)
{
// Or just return if you want - it depends on how you want to handle
// the situation.
throw new IOException("Not enough input data");
}
output.Write(buffer, 0, bytesRead);
size -= bytesRead;
}
}
答案 2 :(得分:1)
如果运行.NET4,那么MemoryMappedFile类在这种情况下非常有用。
如果你运行64位CPU是有益的,否则你必须有一个数据的滑动视图(64位地址空间可以轻松容纳1GB)
答案 3 :(得分:0)
读取零件,检查零件,在需要时添加额外的字节,写入新文件。重复,直到处理完所有。