我想将包含字符串的大文件合并到一个文件中,并尝试使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,这个工作,hower,字符串的格式(例如新行等不会被复制到合并文件):
...
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);
}
...
Run Code Online (Sandbox Code Playgroud)
如何在不将整个文件加载到内存的情况下将大文件与NIO2合并?
Hol*_*ger 18
如果你想有效地合并两个或多个文件,你应该问问自己,为什么你在使用char基础Reader并Writer执行该任务.
通过使用这些类,您可以将文件的字节转换为字符,从系统的默认编码转换为unicode,然后从unicode转换回系统的默认编码.这意味着程序必须对整个文件执行两次数据转换.
而且,顺便说一句,BufferedReader而BufferedWriter绝不是NIO2假象.这些类从Java的第一个版本开始就存在.
当您通过真正的NIO函数使用逐字节复制时,可以在不被Java应用程序触及的情况下传输文件,在最好的情况下,传输将直接在文件系统的缓冲区中执行:
import static java.nio.file.StandardOpenOption.*;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
public class MergeFiles
{
public static void main(String[] arg) throws IOException {
if(arg.length<2) {
System.err.println("Syntax: infiles... outfile");
System.exit(1);
}
Path outFile=Paths.get(arg[arg.length-1]);
System.out.println("TO "+outFile);
try(FileChannel out=FileChannel.open(outFile, CREATE, WRITE)) {
for(int ix=0, n=arg.length-1; ix<n; ix++) {
Path inFile=Paths.get(arg[ix]);
System.out.println(inFile+"...");
try(FileChannel in=FileChannel.open(inFile, READ)) {
for(long p=0, l=in.size(); p<l; )
p+=in.transferTo(p, l-p, out);
}
}
}
System.out.println("DONE.");
}
}
Run Code Online (Sandbox Code Playgroud)