你的test.txt里面存的是什么樣的文本,?編碼格式是什么,?這些都決定了你讀出來的內(nèi)容是否正確,。這段程序只有在UTF-16編碼的文本中能讀出你想要的內(nèi)容,因為.NET的char是unicode的,。如果你不是用UTF-16編碼,比如前兩個字符是ab,,ReadChar會把ab一起讀出來當成一個unicode字符,,天知道那會是什么結(jié)果。而且如果是ReadChar的話一次讀兩個字節(jié),,你怎么可以i++呢,,至少要i+=2吧。另外很多文本文件(至少要windows中)前幾個字節(jié)是BOM標志,。你也沒處理,。
所以,,最簡單的辦法是用CreateViewStream而不是CreateViewAccessor,然后用StreamReader指定Encoding去讀,。
var filePath = @"D:\junk\test.txt";
var fileSize = new FileInfo(filePath).Length;
var viewSize = fileSize / 2;
using (var mm = MemoryMappedFile.CreateFromFile(filePath, FileMode.Open, null, 0, MemoryMappedFileAccess.Read))
using (var stream = mm.CreateViewStream(0, viewSize, MemoryMappedFileAccess.Read))
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
Console.WriteLine(reader.ReadToEnd());
}
如果非要用Accessor,,那這么寫,但是BOM沒處理,,前幾個字符是亂碼
var filePath = @"D:\junk\test.txt";
var fileSize = new FileInfo(filePath).Length;
var viewSize = fileSize / 2;
using (var mm = MemoryMappedFile.CreateFromFile(filePath, FileMode.Open, null, 0, MemoryMappedFileAccess.Read))
using (var accessor = mm.CreateViewAccessor(0, viewSize, MemoryMappedFileAccess.Read))
{
byte[] bytes = new byte[viewSize];
for (int i = 0; i < viewSize; i++)
{
bytes[i] = accessor.ReadByte(i);
}
var results = Encoding.UTF8.GetString(bytes);
Console.WriteLine(results);
}
另外:
你是想要從已經(jīng)存在的文件里讀取數(shù)據(jù),,那么FileMode就不要OpenOrCreate,用Open就好了,。不然文件不存在重新創(chuàng)建了一個,,你讀一堆0出來沒有意義。
如果不是為了和其它進程共享,,mapName可以傳null,。
如果只是讀文件,fileSize的參數(shù)可以傳0,,系統(tǒng)會自動match文件的真實大小,。
對于實現(xiàn)了IDisposible的類,記得用using,,或者在finally里dispose掉,。