Powershell - 在 Readline 上使用 Peek 方法是否有好处(虽然不为空)?

Powershell - Is there a benefit to using the Peek method over Readline (while not null)?

我一直在使用 Streamreader(和 StreamWriter)编写 PowerShell 脚本,将大文件解析为较小的报告。在搜索将这些东西放在一起的最佳方法时,我发现有两种主要用于将内容读取到文件末尾的方法。

1 - while ($reader.Peek() -ge 0) { $line = $reader.Readline() ... }

2 - while (($line = $read.ReadLine()) -ne $null) { do stuff ... }

从文档来看,Peek will read the next value, but not change the position of the reader. It looks like ReadLine 基本上会做同样的事情,但请阅读整个 string/line。我觉得这是一个 "no-duh" 问题 - 在阅读该行之前实际查看一个值是否真的更有效,或者它只是在将 reader 分配给变量之前的一个额外步骤?

提前致谢!

既然你无论如何都需要台词,我认为没有理由 Peek()。如果你真的想检查你是否在最后,那么 .EndOfStream property 可能更准确。

As discussed here.Peek() 也可以 return -1 当错误发生时,而不仅仅是当到达流的末尾时。那里的大多数答案还建议避免使用它并仅使用 .ReadLine()

mklement0 also mentioned using System.IO.File.ReadLines。这个 return 是一个可枚举的,所以你可以用路径调用它并像其他可枚举一样使用它,而不是一次加载所有行(所以它仍然适用于大文件)。

您可以将它与 foreachForEach-Object 一起使用,例如:

foreach ($line in ([System.IO.File]::ReadLines('path\to\file'))) {
    $line
}


[System.IO.File]::ReadLines('path\to\file') | ForEach-Object -Process {
    $_
}

$reader = [System.IO.File]::ReadLines('path\to\file')

foreach ($line in $reader) { $line }
$reader | ForEach-Object -Process { $_ }