我有一個Filestream
和我正在閱讀一個大文件。文件流和CRLF分隔符?
分隔符是CRLF
,我想直到CRLF纔讀。
如何使用Filestream來做到這一點? 是Filestream
哪怕是正確的選擇?
我不喜歡readallLines
或類似的方法,你必須將所有文件加載到內存中。
主要優先級是內存效率。
我有一個Filestream
和我正在閱讀一個大文件。文件流和CRLF分隔符?
分隔符是CRLF
,我想直到CRLF纔讀。
如何使用Filestream來做到這一點? 是Filestream
哪怕是正確的選擇?
我不喜歡readallLines
或類似的方法,你必須將所有文件加載到內存中。
主要優先級是內存效率。
您的評論戲劇性地改變了問題;所以你有一個打開FileStream
,你想找到下一個CRLF ('\r\n')
在它;在這種情況下,類似的東西可以實現:
private static long GetNextCRLFPosition(FileStream stream) {
try {
long savedPosition = fs.Position;
// ReadByte - we're working with binary file...
for (int item = fs.ReadByte(); item >= 0; item = fs.ReadByte()) {
if (item == '\r') {
item = fs.ReadByte();
if (item == '\n')
return fs.Position - 2;
else
fs.Seek(-1, SeekOrigin.Current);
}
}
return -1;
}
finally {
fs.Seek(savedPosition, SeekOrigin.Begin);
}
}
...
using (FileStream fs = new FileStream(@"C:\MyFile.Text", FileMode.Open)) {
...
// The next "\r\n" is in shift bytes
long shift = GetNextCRLFPosition(fs);
...
}
我的問題是我所謂的二進制文件包含很多「文本」,所以我必須在'FileStream'和'StreamReader'之間進行交換。如果我從StreamReader讀取'ReadLines',我是否也改變'FileStream'的位置? SomeHow我不能得到那個工作。 – RayOldProf
@RayOldProf StreamReader似乎只是一個圍繞FileStream的層,只是使用它的[FileStream] Position屬性。所以他們的位置是連接的。 – Vlad
我剛剛發現並不那麼簡單。 'StreamReader'使用一些'buffer',它的位置不等於'FileStream'。因此我不能使用StreamReader。任何選擇? – RayOldProf
'File.ReadLines()'不閱讀所有的文件等等'File.ReadLines(@ 'C:\ MyFile.txt的')。以( 1)'可能是一個解決方案; (注意'ReadAllLines'和'ReadLines'之間的區別) –