我想将包含字符串的大文件分割成一组新的(较小)文件并尝试使用nio2。按最大行分割非常大的文本文件
我不想将整个文件加载到内存中,所以我尝试了使用BufferedReader。
较小的文本文件应受限于文本行的数量。
解决方案的工作,但我要问,如果有人知道由延髓的Java 8(可能与流lamdas() - API?)具有更好的性能的解决方案和NIO2:
public void splitTextFiles(Path bigFile, int maxRows) throws IOException{
int i = 1;
try(BufferedReader reader = Files.newBufferedReader(bigFile)){
String line = null;
int lineNum = 1;
Path splitFile = Paths.get(i + "split.txt");
BufferedWriter writer = Files.newBufferedWriter(splitFile, StandardOpenOption.CREATE);
while ((line = reader.readLine()) != null) {
if(lineNum > maxRows){
writer.close();
lineNum = 1;
i++;
splitFile = Paths.get(i + "split.txt");
writer = Files.newBufferedWriter(splitFile, StandardOpenOption.CREATE);
}
writer.append(line);
writer.newLine();
lineNum++;
}
writer.close();
}
}
由于您只读取一次和连续的文件,我不认为任何API可能会给你更好的性能。 Lambdas可以使代码看起来更好,但由于你的过程是大规模的IO绑定,所以它们不会影响性能。 – biziclop 2014-08-28 16:45:54
谢谢。在http://stackoverflow.com/questions/25546750/merge-huge-files-without-loading-whole-file-into-memory/25548570?noredirect=1#comment39895492_25548570 nio2与FileChannel一起使用,它比基于字符的阅读器但是,我猜想,对于这种情况,我无法使用FileChannel,因为我需要访问文件的实际行。 – nimo23 2014-08-28 19:36:56
好点,是的,这也是它的一部分。如果你想要固定大小的块(例如每个文件只有1MB),那么你肯定可以节省将字节转换为字符的成本。 – biziclop 2014-08-28 19:41:38