複数のファイルを交互にマージする

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このプロジェクトでは、複数のテキストファイルを交互に行ごとにマージする方法を学びます。これは、データ処理やファイル管理において、複数のファイルのコンテンツを1つのファイルに結合する必要がある場合に一般的なタスクです。

🎯 タスク

このプロジェクトでは、以下を学びます。

  • ファイルマージプロセスに必要な入力ファイルを準備する方法
  • 入力ファイルのコンテンツをマージする関数を実装する方法
  • ファイルマージプロセスを実行して出力を検証する方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • Javaにおけるファイル入出力操作を行うことができるようになります。これには、ファイルの読み取りと書き込みが含まれます。
  • Javaの組み込みのファイルとストリームクラスを使用して、ファイル操作を処理するようになります。
  • 複数のファイルのコンテンツを結合するためのカスタムファイルマージアルゴリズムを実装するようになります。
  • ファイルマージプロセスの正しさをテストして検証するようになります。

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/create_write_files("Create/Write Files") java/FileandIOManagementGroup -.-> java/read_files("Read Files") java/FileandIOManagementGroup -.-> java/io("IO") subgraph Lab Skills java/files -.-> lab-300382{{"複数のファイルを交互にマージする"}} java/create_write_files -.-> lab-300382{{"複数のファイルを交互にマージする"}} java/read_files -.-> lab-300382{{"複数のファイルを交互にマージする"}} java/io -.-> lab-300382{{"複数のファイルを交互にマージする"}} end

マージ関数を実装する

このステップでは、入力ファイルのコンテンツをマージする merge 関数を実装します。

  1. /home/labex/project ディレクトリ内の FileMerge.java ファイルを開きます。

  2. merge 関数を見つけて、既存のコードを以下の実装で置き換えます。

public static void merge(String[] sourcePath, String outPath) throws IOException {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(outPath))) {
        BufferedReader[] readers = new BufferedReader[sourcePath.length];
        String[] currentLines = new String[sourcePath.length];
        boolean[] fileEmpty = new boolean[sourcePath.length];

        // 各ソースファイルに対してリーダーを開く
        for (int i = 0; i < sourcePath.length; i++) {
            readers[i] = new BufferedReader(new FileReader(sourcePath[i]));
            currentLines[i] = readers[i].readLine();
            fileEmpty[i] = (currentLines[i] == null);
        }

        // 各ファイルの行をマージする
        boolean allFilesEmpty = false;
        while (!allFilesEmpty) {
            allFilesEmpty = true;
            for (int i = 0; i < sourcePath.length; i++) {
                if (!fileEmpty[i]) {
                    writer.write(currentLines[i]);
                    writer.newLine();
                    currentLines[i] = readers[i].readLine();
                    fileEmpty[i] = (currentLines[i] == null);
                    allFilesEmpty = false;
                }
            }
        }

        // リーダーを閉じる
        for (BufferedReader reader : readers) {
            reader.close();
        }
    }
}

この実装では、各入力ファイルに対して BufferedReader を開き、各ファイルから行を読み取り、交互に行を出力ファイルに書き込みます。ファイルにもう行がない場合、すべてのファイルのすべての行が出力ファイルに書き込まれるまで、そのファイルはスキップされます。

✨ 解答を確認して練習

ファイルマージプロセスを実行する

このステップでは、ファイルマージプロセスを実行して出力を検証します。

  1. /home/labex/project ディレクトリ内の FileMerge.java ファイルを開きます。

  2. main 関数を見つけて、strs 配列に入力ファイルの名前 "1.txt""2.txt""3.txt" が含まれていることを確認します。

  3. ターミナルで以下のコマンドを実行して FileMerge クラスを実行します。

javac FileMerge.java
java FileMerge
  1. プログラムが正常に実行された後、/home/labex/project ディレクトリに新しいファイル 0.txt が作成されます。このファイルには入力ファイルのマージされたコンテンツが含まれています。

  2. 0.txt ファイルを開いて、コンテンツが期待される出力と一致することを確認します。

1
6
7
2
8
3
9
4
5

おめでとうございます!あなたは正常にファイルマージプロジェクトを完了しました。

✨ 解答を確認して練習

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたは実験技術を向上させるために、LabExでさらに多くの実験を行うことができます。