我想將包含字符串的大文件合併到一個文件中,並嘗試使用nio2。我不想加載整個文件到內存中,所以我的BufferedReader試了一下:合併大文件而不將整個文件加載到內存中?
public void mergeFiles(filesToBeMerged) throws IOException{
Path mergedFile = Paths.get("mergedFile");
Files.createFile(mergedFile);
List<Path> _filesToBeMerged = filesToBeMerged;
try (BufferedWriter writer = Files.newBufferedWriter(mergedFile,StandardOpenOption.APPEND)) {
for (Path file : _filesToBeMerged) {
// this does not work as write()-method does not accept a BufferedReader
writer.append(Files.newBufferedReader(file));
}
} catch (IOException e) {
System.err.println(e);
}
}
我這個試了一下,這個工作,豪爾,該字符串的格式(例如,新線等不復制到合併文件):
...
try (BufferedWriter writer = Files.newBufferedWriter(mergedFile,StandardOpenOption.APPEND)) {
for (Path file : _filesToBeMerged) {
// writer.write(Files.newBufferedReader(file));
String line = null;
BufferedReader reader = Files.newBufferedReader(file);
while ((line = reader.readLine()) != null) {
writer.append(line);
writer.append(System.lineSeparator());
}
reader.close();
}
} catch (IOException e) {
System.err.println(e);
}
...
如何在不將整個文件加載到內存的情況下將大文件與NIO2合併?
哇,這個解決方案真的很棒 - 源代碼太短了。謝謝!你知道一個基於nio2的解決方案將一個大文件分割成一組較小的文件嗎?其實,我正在使用類似http://todayguesswhat.blogspot.de/2014/05/java-split-large-file-sample-code-high.html。 – nimo23 2014-08-28 12:52:58
@ nimo23:好吧,我想,當你試着理解我的答案的代碼,尤其是['FileChannel.transferTo'](http://docs.oracle.com/javase/7/docs/api/java/ nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)),你會意識到分裂的解決方案看起來是怎樣的(閱讀:非常相似)。如果您在實施時遇到困難,您可以打開一個新問題。 – Holger 2014-08-28 13:40:25
好的,我會自己試試,並會在這裏提供解決方案! – nimo23 2014-08-28 13:46:39