在.NET中,是否可以对二进制文件进行缓存,并对缓存的文件进行常规文件操作?
在.NET中,是否可以对二进制文件进行缓存,并对缓存的文件进行常规文件操作?
这种方法是先将FileStream
中的所有内容读入到一个MemoryStream
对象中,然后再将这个对象用于后续的I/O操作。两种类型都继承自Stream
,因此使用方式基本相同。
以下是示例代码:
private MemoryStream cachedStream;
public void CacheFile(string fileName)
{
cachedStream = new MemoryStream(File.ReadAllBytes(fileName));
}
当你希望缓存给定的文件时,只需调用CacheFile
方法一次,然后在代码的任何其他地方使用cachedStream
进行读取。(实际文件将在其内容被缓存后立即关闭。)唯一需要记住的是在完成后处理cachedStream
。
byte []
页面。这一次,您将为每个页面设置一个脏标志。您将实现Stream方法,使其隐藏调用方的细节,并在必要时拉入(或丢弃)页面缓冲区。当然,你可以将文件读入一个byte[]数组并开始处理。如果您想使用流,则可以将FileStream复制到MemoryStream中并开始使用它,例如:
public static void CopyStream( Stream input, Stream output )
{
var buffer = new byte[32768];
int readBytes;
while( ( readBytes = input.Read( buffer, 0, buffer.Length ) ) > 0 )
{
output.Write( buffer, 0, readBytes );
}
}
如果你关心性能——通常来说,不同的文件访问方法内置的机制应该足够。
在Lucene中有一个非常优雅的缓存系统,它将字节从磁盘缓存到内存中,并智能更新存储等。你可能想看看那些代码,以了解他们如何实现。你也可以阅读 Microsoft SQL Server 数据存储层的相关资料 - 因为MSSQL团队对一些更关键的实现细节非常乐于分享。