代码之家  ›  专栏  ›  技术社区  ›  Stefan Moser

为什么会这样文件流位置以1024的倍数递增?

  •  10
  • Stefan Moser  · 技术社区  · 14 年前

    我有一个文本文件,我想逐行读取,并记录在文本文件的位置,因为我去。在读取了文件的任何一行之后,程序都可以退出,我需要在下一行继续读取文件。

    下面是一些示例代码:

    using (FileStream fileStream = new FileStream("Sample.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        fileStream.Seek(GetLastPositionInFile(), SeekOrigin.Begin);
        using (StreamReader streamReader = new StreamReader(fileStream))
        {
            while (!streamReader.EndOfStream)
            {
                string line = streamReader.ReadLine();
                DoSomethingInteresting(line);
                SaveLastPositionInFile(fileStream.Position);
    
                if (CheckSomeCondition())
                {
                    break;
                }
            }
        }
    }
    

    当我运行这个代码时 fileStream.Position

    3 回复  |  直到 14 年前
        1
  •  13
  •   Jon Skeet    14 年前

    FileStream 这是有责任的-这是 StreamReader

    有效的 河流的位置 流阅读器 担心是棘手的。。。尤其是作为 ReadLine 将放弃行尾,因此无法准确地重建原始数据(它可能以“\n”或“\r\n”结尾)。如果你能 暴露了一些东西,使这更容易(我很肯定它) 能够

    EndOfStream ,你一直读到 读线 返回null。我只是觉得简单:

    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // Process the line
    }
    
        2
  •  2
  •   lindexi    4 年前

            using(FileStream fileStream = new FileStream("Sample.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
            {
                fileStream.Seek(GetLastPositionInFile(), SeekOrigin.Begin);
                /**Int32 position = 0;**/
                using(StreamReader streamReader = new StreamReader(fileStream)) 
                {
                    while(!streamReader.EndOfStream) 
                    {
                        string line = streamReader.ReadLine();
                        /**position += line.Length;**/
                        DoSomethingInteresting(line);
                        /**SaveLastPositionInFile(position);**/
    
                        if(CheckSomeCondition()) 
                        {
                            break;
                        }
                    }
                }
            }
    
        3
  •  0
  •   bigtang    14 年前

    如果你的文件不是太大,为什么不在big chuncks中读取整个内容,然后操纵字符串-可能比stop-and-go i/o更快。

                //load entire file
                StreamReader srFile = new StreamReader(strFileName);
                StringBuilder sbFileContents = new StringBuilder();
                char[] acBuffer = new char[32768];
                while (srFile.ReadBlock(acBuffer, 0, acBuffer.Length)
                    > 0)
                {
                    sbFileContents.Append(acBuffer);
                    acBuffer = new char[32768];
                }
    
                srFile.Close();