【发布时间】:2014-10-22 14:29:00
【问题描述】:
我想将一个包含字符串的大文件拆分成一组新的(较小的)文件,并尝试使用 nio2。
我不想将整个文件加载到内存中,所以我尝试使用 BufferedReader。
较小的文本文件应受文本行数的限制。
该解决方案有效,但是我想问是否有人知道使用 java 8(可能是带有 stream()-api 的 lamdas?)和 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 限制,因此它们根本不会影响性能。
-
谢谢。在stackoverflow.com/questions/25546750/… nio2 与 FileChannel 一起使用,它比基于 char 的阅读器执行得更好,但是,我猜,对于这种情况,没有办法使用 FileChannel,因为我需要访问文件的实际行。
-
好点,是的,这也是其中的一部分。如果你想要固定大小的块(例如每个文件正好是 1MB),你绝对可以节省将字节转换为字符的成本。