如何将文件夹中的所有txt文件合并到一个文件中?文件夹通常包含数百到数千个txt文件。
如果这个程序只能在Windows机器上运行,我会选择包含
之类的批处理文件 copy /b *.txt merged.txt
但事实并非如此,所以我认为用Java编写它可能更容易补充我们所拥有的一切。
我写过类似的东西
// Retrieves a list of files from the specified folder with the filter applied
File[] files = Utils.filterFiles(downloadFolder + folder, ".*\\.txt");
try
{
// savePath is the path of the output file
FileOutputStream outFile = new FileOutputStream(savePath);
for (File file : files)
{
FileInputStream inFile = new FileInputStream(file);
Integer b = null;
while ((b = inFile.read()) != -1)
outFile.write(b);
inFile.close();
}
outFile.close();
}
catch (Exception e)
{
e.printStackTrace();
}
但要合并数千个文件需要几分钟时间,因此不可行。
答案 0 :(得分:4)
使用NIO,比使用输入流/输出流更容易 。注意:使用Guava的Closer
,这意味着所有资源都安全关闭;更好的方法是使用Java 7和try-with-resources。
final Closer closer = Closer.create();
final RandomAccessFile outFile;
final FileChannel outChannel;
try {
outFile = closer.register(new RandomAccessFile(dstFile, "rw"));
outChannel = closer.register(outFile.getChannel());
for (final File file: filesToCopy)
doWrite(outChannel, file);
} finally {
closer.close();
}
// doWrite method
private static void doWrite(final WriteableByteChannel channel, final File file)
throws IOException
{
final Closer closer = Closer.create();
final RandomAccessFile inFile;
final FileChannel inChannel;
try {
inFile = closer.register(new RandomAccessFile(file, "r"));
inChannel = closer.register(inFile.getChannel());
inChannel.transferTo(0, inChannel.size(), channel);
} finally {
closer.close();
}
}
答案 1 :(得分:2)
因为这个
Integer b = null;
while ((b = inFile.read()) != -1)
outFile.write(b);
您的操作系统正在进行大量IO调用。 read()
只读取一个字节的数据。使用接受byte[]
的其他read methods。然后,您可以使用byte[]
写入OutputStream
。类似地,write(int)
执行写入单个字节的IO调用。改变它。
当然,您可以查看为您执行此操作的工具,例如Apache Commons IO甚至Java 7 NIO包。
答案 2 :(得分:0)
尝试使用BufferedReader和BufferedWriter而不是逐个写字节。
答案 3 :(得分:0)
您可以使用IoUtils合并文件,IoUtils.copy()方法将帮助您合并文件。
此链接可能有用merging file in java
答案 4 :(得分:0)
我会这样做!
检查操作系统
System.getProperty( “os.name”)
从Java运行系统级命令。
如果是windows
copy /b *.txt merged.txt
如果是Unix
cat *.txt > merged.txt
或任何可用的最佳系统级命令。