Java
 Computer >> コンピューター >  >> プログラミング >> Java

2つ以上のファイルを交互に1つのファイルへマージするJavaプログラム


Javaでは、ScannerクラスとFileWriterクラスを組み合わせることで、複数のテキストファイルの内容を読み込み、1つの新しいファイルへ簡単にマージ(結合)できます。本記事では、3つのファイルから交互に1行ずつ読み取って結合する方法と、同じディレクトリ内の全ファイルを一括で結合する方法の2つのアプローチを紹介します。

前提となる入力ファイル

ここでは、次の3つのテキストファイルが用意されているものとします。

output1.txt

Hello how are you

output2.txt

Welcome to Tutorialspoint

output3.txt

We provide simply easy learning

例1:3つのファイルを交互にマージする

次のJavaプログラムは、3つのファイルから1行ずつ順番に読み取り、その内容を交互にresult.txtへ書き込みます。どれか1つでも読み取れる行が残っている限りwhileループが繰り返されるため、行数の異なるファイルでも安全に処理できます。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class MergingFiles {
   public static void main(String args[]) throws IOException {
      Scanner sc1 = new Scanner(new File("D://input1.txt"));
      Scanner sc2 = new Scanner(new File("D://input2.txt"));
      Scanner sc3 = new Scanner(new File("D://input3.txt"));
      FileWriter writer = new FileWriter("D://result.txt");

      // いずれかのファイルに行が残っている間、交互に読み書きを行う
      while (sc1.hasNextLine() || sc2.hasNextLine() || sc3.hasNextLine()) {
         if (sc1.hasNextLine()) {
            writer.append(sc1.nextLine() + "\n");
         }
         if (sc2.hasNextLine()) {
            writer.append(sc2.nextLine() + "\n");
         }
         if (sc3.hasNextLine()) {
            writer.append(sc3.nextLine() + "\n");
         }
      }
      writer.flush();
      writer.close();
      System.out.println("Contents added");
   }
}

実行結果

Contents added

プログラムの実行後、result.txtには各ファイルの内容が交互に書き込まれます。

Hello how are you
Welcome to Tutorialspoint
We provide simply easy learning

例2:同一ディレクトリ内の全ファイルを結合する

マージしたいファイルがすべて同じディレクトリにある場合は、File#listFiles()メソッドでファイル一覧を取得し、拡張for文で順番に処理すると簡潔に記述できます。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class MergingFiles {
   public static void main(String args[]) throws IOException {
      // ディレクトリを表すFileオブジェクトを生成
      File directoryPath = new File("D:\\example");
      // ディレクトリ内の全ファイル・フォルダの一覧を取得
      File filesList[] = directoryPath.listFiles();

      FileWriter writer = new FileWriter("D://output.txt");
      for (File file : filesList) {
         Scanner sc = new Scanner(file);
         while (sc.hasNextLine()) {
            String input = sc.nextLine();
            writer.append(input + "\n");
         }
         sc.close();
      }
      writer.flush();
      writer.close();
      System.out.println("Contents added");
   }
}

実行結果

Contents added

このプログラムでは、ディレクトリ内の各ファイルの内容が先頭のファイルから順にoutput.txtへ書き込まれていきます。

コードのポイント

  • Scannerクラス:hasNextLine()で次の行の有無を確認し、nextLine()で1行ずつ読み込みます。例1のように各ファイルのhasNextLine()をチェックすることで、行数の異なるファイル同士でもNoSuchElementExceptionを回避しながらマージできます。
  • FileWriterクラス:append()メソッドで文字列を末尾に追記します。コンストラクタの第2引数にtrueを指定すれば、既存ファイルへの追記モードになります。
  • flush()/close():バッファに残ったデータを確実にディスクへ書き出すため、処理の最後には必ず呼び出しましょう。try-with-resources構文を使えばクローズ処理を自動化でき、より安全です。
  • 注意点:listFiles()はサブディレクトリも返す場合があるため、file.isFile()でファイルだけを対象にするとより堅牢なコードになります。

まとめ

ScannerとFileWriterを組み合わせれば、複数ファイルの交互マージもディレクトリ単位の一括結合も、シンプルなコードで実現できます。行数の異なるファイルを扱う際は、hasNextLine()による存在チェックを忘れないようにしましょう。

  1. Javaでディレクトリ内のすべてのファイルを再帰的に一覧表示する方法

    この記事では、Javaを使って指定したディレクトリ内のすべてのファイルを再帰的に一覧表示するプログラムを解説します。サブディレクトリの中にあるファイルまで含めて取得できるため、フォルダ全体の内容を把握したい場合に便利なテクニックです。 前提となるディレクトリ構成 Dドライブ直下に「ExampleDirectory」というフォルダがあり、その中に7つのファイルと2つのサブディレクトリが格納されていると仮定します。 各サブディレクトリの内容は以下の通りです。 SampleDirectory1:SampleFile1.txt と SampleFile2.txt の2つのファイルを含みます。 Sa

  2. Windowsで複数のPDFファイルを1つに結合する方法|無料ツールを使った簡単手順

    2つ以上のPDFファイルを1つにまとめたいと思っていませんか?共通のテーマを持つ複数のPDFファイルがあるなら、それらを1つのファイルに結合しておくと、管理や共有が格段に楽になります。 この記事では、Windows環境で複数のPDFファイルを結合する具体的な手順を、わかりやすくステップごとに解説していきます。 Adobeの無料オンラインツールでPDFを結合する方法 PDFファイルの結合は、実はとてもシンプルな作業です。Adobeが提供している無料ツールを使えば、誰でも簡単に完了できます。以下の手順に従ってみましょう。 まず、Adobe公式サイトの無料オンラインPDF結合ツールにアクセスします。