3

フォルダー内のすべての txt ファイルを 1 つのファイルに結合するにはどうすればよいですか? 通常、フォルダーには数百から数千の 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();
}

しかし、何千ものファイルを結合するには数分かかるため、現実的ではありません。

4

5 に答える 5

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();
    }
}
于 2013-07-11T16:14:49.370 に答える
0

私ならこうする!

  1. OSのチェック

    System.getProperty("os.name")

  2. Java からシステム レベル コマンドを実行します。

    窓の場合

            copy /b *.txt merged.txt
    

    Unixの場合

            cat *.txt > merged.txt
    

    または利用可能な最高のシステムレベルコマンド。

于 2013-07-11T16:30:29.010 に答える
0

IoUtils を使用してファイルをマージできます。IoUtils.copy() メソッドはファイルのマージに役立ちます。

このリンクは、Javaでファイルをマージするのに役立つ場合があります

于 2013-07-11T16:05:57.323 に答える