我使用Groovy和我想有一个文本文件,在特定的行被改变,而无需通过以前所有的线循环。 有没有办法说出要希望改变文本文件的行?
例如
文本文件:
1
2
3
4
5
6
我想说
Line(3) = p
并将其更改文本文件:
1
2
p
4
5
6
我不想一直做一个遍历行迭代更改值,又名我不想使用.eachline {线 - > ...}方法。
谢谢你在前进,我真的很感激!
我使用Groovy和我想有一个文本文件,在特定的行被改变,而无需通过以前所有的线循环。 有没有办法说出要希望改变文本文件的行?
例如
文本文件:
1
2
3
4
5
6
我想说
Line(3) = p
并将其更改文本文件:
1
2
p
4
5
6
我不想一直做一个遍历行迭代更改值,又名我不想使用.eachline {线 - > ...}方法。
谢谢你在前进,我真的很感激!
我不认为你可以跳过线和穿越这个样子。 你可以通过做跳跃随机访问文件在Java中,但不是你行应指定的字节数。
尝试使用readLines()
在文件中的文本。 它将存储列表中的所有台词。 要改变在第n行的内容,在名单上的N-1指数变化的内容,然后在列表项加入。 像这样的东西会做
//We can call this the DefaultFileHandler
lineNumberToModify = 3
textToInsert = "p"
line( lineNumberToModify, textToInsert )
def line(num , text){
list = file.readLines()
list[num - 1] = text
file.setText(list.join("\n"))
}
编辑:对于非常大的文件,最好是你有一个自定义实现。 可能是在什么蒂姆·耶茨在对你的问题的意见建议了线的东西。 上述readlines方法()可高达100000行文字内小于仲丁基容易处理。 所以,你可以这样做:
if(file size < 10 MB)
use DefaultFileHandler()
else
use CustomFileHandler()
//CustomFileHandler
- Split the large file into buckets of acceptable size.
- Ex: Bucket 1(1-100000 lines), Bucket 2(100000-200000 lines), etc.
- if (lineNumberToModify falls in bucket range)
insert into line in the bucket
没有一成不变的规则来定义你如何实现你的CustomFileHandler,因为它完全取决于所使用的情况。 如果您需要多次做上述操作在同一个文件,你可以选择先做完整斗分裂,将它们存储在存储器中,并使用桶进行以下操作。 或者,如果它是一个时间的操作,就可以避免第一次操纵所有的桶,但对付你只需要什么,后来在按需的基础处理等。
而且即使在桶,你可以定义自己的智慧,加快你的工作。 说,如果你要插入到99999线铲斗相1-100000线,你可以利用常规的方法和关闭,以最充分,
file.readLines().reverse()[1] = "some text"