【问题标题】:Reading line by line an inputstream逐行读取输入流
【发布时间】:2018-01-08 18:51:54
【问题描述】:

我有一个网站向我的服务器发布一个大文件。我需要逐行阅读或至少能够拆分它。它有 2000 页长。

现在,我有:

if (file != null && file.ContentLength > 0)
                {
                    using (file.InputStream)
                    {
                       //Looking for this part
                    }
                }

谢谢,

菲尔

【问题讨论】:

  • 使用StreamReader 并使用ReadLine() 阅读

标签: c# file stream


【解决方案1】:

我遵循@Gusman 的想法使用流式阅读器。

stream = new StreamReader(file.InputStream);
using (stream)
{
    while (stream.Peek() >= 0)
    {
        var line =  stream.ReadLine();
        //some stuff              
    }
}

也感谢@Ali

【讨论】:

    【解决方案2】:

    试试这个:

    public IEnumerable<string> ReadLines(Func<Stream> streamProvider,
                                         Encoding encoding)
    {
        using (var stream = streamProvider())
        using (var reader = new StreamReader(stream, encoding))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }
    

    所以:

    var lines = ReadLines(() => file.InputStream, Encoding.UTF8).ToArray();
    

    希望对你有所帮助

    【讨论】:

    • 违背了用户的目的,将返回数组中的所有行,与File.ReadAllLines 完全相同,但开销很大,用户希望逐行阅读处理它,而不是将所有文件都放在内存中。
    • @Gusman 它不会,它会从流中一次返回一行。它返回一个 IEnumerable 而不是一个数组。 (来自这里的原始代码:stackoverflow.com/a/13312954/468973
    • 所以我返回yield return line,它可以被枚举,它可以与ToArray一起运行
    • 好吧,我看错了,抱歉。无论如何,流式阅读器会更容易和默认方式
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多