使用Groovy读取文件中的特定行

6

有人能帮我逐行读取文件吗?

我有这段代码- 但是这段代码会打印出所有内容。我只需要逐行显示第5行(或指定行),因此我想动态访问和打印任何行。我需要打印文本文件的第5行。

//read from file

myFile = new File("C:\\Documents and Settings\\ABCEDFG\\Desktop\\soapUI\\params.txt")
printFileLine = { log.info "File line: " + it }
myFile.eachLine(0, printFileLine)

请帮忙 - 非常感谢您的帮助!

^谢谢

3个回答

11

虽然不够优雅且浪费资源,但你可以这样做

log.info "Line 5: " +  myFile.readLines().get(4)

谢谢Art Taylor。这个工作得很好。感谢你的帮助! 还有,请问如何获取文件中行数的总计? - ABCDEFG
readLines() 返回一个 java.util.List<String> 对象,其中包含所有行。List 有一个方法 size(),告诉您列表包含多少项。因此基本上是:myFile.readLines().size() - bezmax
另外,如果您正在使用此解决方案,则最好将该列表保存在某个地方并重复使用它,以避免无用的IO操作。例如:List<String> fileLines = myFile.readLines(); String line4 = fileLines.get(4); String line5 = fileLines.get(5); int count = fileLines.size(); - bezmax
感谢Max。虽然我是自己找到的。保持联系! - ABCDEFG

5
如果你不想将所有内容存储在内存中,可以进行以下操作:
String readLine( File f, int n ) {
  String line = null
  f.withReader { r ->
    while( n-- > 0 && ( ( line = r.readLine() ) != null ) ) ;
  }
  line
}

然后,要打印第5行:
File infile = new File("C:\\Documents and Settings\\ABCEDFG\\Desktop\\soapUI\\params.txt")
String line = readLine( infile, 5 )
println line

然而,如果您想以随机访问方式阅读许多行,这可能是浪费的,因为每次都需要从开头滚动文件。然而,如果由于文件过大而无法将其加载到内存中,则没有其他选择。

谢谢Tim。这个也很好用。 感激你的帮助! - ABCDEFG
运行良好,但存在“+1”偏移,即为了获取第一行,需要使用readLine(file, 1)而不是get(0) - Marmite Bomber

1

你无法以任何优化的方式做到这一点。在这里有两个选择:

  1. 将所有文件加载到内存中并构建行索引。
  2. 每次需要访问第N行时,从0到(N-1)读取所有行。

解释:

换行符只是一个字符。如果不读取所有字符,你无法告诉文件系统如何跳过到第N行。你需要实际找到第N个换行符才能知道第N行从哪里开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接