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

Javaで.txtファイルの特定の行を上書き・置換する方法【サンプルコード付き】

Javaプログラムからテキストファイル(.txt)の特定の行だけを書き換えたい場面は多くあります。この記事では、ScannerStringBufferreplaceAll()FileWriter を組み合わせて、ファイル内の1行を読み込み、別の文字列に差し替えて上書き保存する方法を、実際のコード例とともにわかりやすく解説します。

使用するAPI

String.replaceAll()メソッド

StringクラスのreplaceAll()メソッドは、正規表現と置換後の文字列の2つの引数を受け取り、パターンに一致したすべての箇所を指定した文字列に置き換えます。「ある行を別の行に差し替える」という今回の処理の中核となるメソッドです。

java.util.Scannerクラス

Scannerクラスは、コンストラクタにFile、InputStream、Path、Stringなどのオブジェクトを渡して生成でき、正規表現を用いてソースからプリミティブ型や文字列をトークン単位で読み取ります。nextXXX()系のメソッド(nextLine()、nextInt()など)を使えば、さまざまなデータ型を読み込むことが可能です。

java.lang.StringBufferクラス

StringBufferクラスは、Stringの可変(ミュータブル)な代替クラスです。インスタンス化した後、append()メソッドで文字列データを自由に追記できます。ファイル全体の内容を一時的に保持するバッファとして活用します。

処理の手順

ファイルの特定の行を上書きするには、「読み込み → 置換 → 書き戻し」の3ステップで処理を行います。

ステップ1:ファイルの内容を文字列として読み込む

  • Fileクラスをインスタンス化して対象ファイルを指定します。
  • Fileオブジェクトを引数にScannerクラスをインスタンス化します。
  • 空のStringBufferオブジェクトを作成します。
  • hasNextLine()とnextLine()で1行ずつ読み込み、append()メソッドでStringBufferに追記していきます。
  • toString()メソッドでStringBufferをStringに変換します。
  • Scannerオブジェクトをclose()して閉じます。

ステップ2:該当行を置換する

取得した文字列に対してreplaceAll()メソッドを呼び出し、第1引数に置換対象の行(旧行)、第2引数に新しい行を渡します。

ステップ3:ファイルに書き戻す

  • FileWriterクラスをインスタンス化します。
  • append()メソッドでreplaceAll()の結果をFileWriterに書き込みます。
  • flush()メソッドでバッファ内のデータをファイルに確定させます。

サンプルコード

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

public class OverwriteLine {
    public static void main(String args[]) throws IOException {
        // 対象ファイルのパスを指定
        String filePath = "D://input.txt";
        // ファイルを読み込むためにScannerクラスをインスタンス化
        Scanner sc = new Scanner(new File(filePath));
        // StringBufferクラスをインスタンス化
        StringBuffer buffer = new StringBuffer();
        // ファイルの各行を読み込み、StringBufferに追記
        while (sc.hasNextLine()) {
            buffer.append(sc.nextLine()+System.lineSeparator());
        }
        String fileContents = buffer.toString();
        System.out.println("Contents of the file: "+fileContents);
        // Scannerオブジェクトをクローズ
        sc.close();
        String oldLine = "No preconditions and no impediments. Simply Easy Learning!";
        String newLine = "Enjoy the free content";
        // 古い行を新しい行に置換
        fileContents = fileContents.replaceAll(oldLine, newLine);
        // FileWriterクラスをインスタンス化
        FileWriter writer = new FileWriter(filePath);
        System.out.println("");
        System.out.println("new data: "+fileContents);
        writer.append(fileContents);
        writer.flush();
    }
}

実行結果

Contents of the file: Tutorials Point originated from the idea that there exists a 
class of readers who respond better to online content and prefer to learn new skills.
Our content and resources are freely available and we prefer to keep it that way to 
encourage our readers acquire as many skills as they would like to.
We don't force our readers to sign up with us or submit their details either.
No preconditions and no impediments. Simply Easy Learning!

new data: Tutorials Point originated from the idea that there exists a class of readers 
who respond better to online content and prefer to learn new skills.
Our content and resources are freely available and we prefer to keep it that way to 
encourage our readers acquire as many skills as they would like to.
We don't force our readers to sign up with us or submit their details either.
Enjoy the free content

補足:try-with-resourcesによる安全なリソース管理

実務のコードでは、ScannerやFileWriterのようなリソースはtry-with-resources構文で宣言し、自動的にクローズさせるのが推奨されます。例外が発生した場合でも確実にリソースが解放されるため、リソースリークを防ぎ、より堅牢なプログラムになります。


  1. Javaでディレクトリ階層を作成する方法|mkdirs()メソッドの使い方を解説

    java.ioパッケージに含まれるFileクラスは、システム上のファイルやディレクトリ(パス名)を表現するためのクラスです。このクラスには、ファイルやディレクトリに対してさまざまな操作を行うためのメソッドが数多く用意されています。 mkdir()メソッドを使用すると、現在のFileオブジェクトが表すパスにディレクトリを1つ作成できます。ただし、このメソッドは親ディレクトリが存在しない場合には失敗するという点に注意が必要です。 ディレクトリ階層を作成するには? 複数階層からなる新しいディレクトリ構造を一括で作成したい場合は、同じFileクラスのmkdirs()メソッドを使用します。このメソッドは

  2. JavaでJSONファイルを作成する方法をわかりやすく解説

    JSON(JavaScript Object Notation)は、人間が読みやすい形式でデータを交換するために設計された、軽量なテキストベースのオープン標準フォーマットです。JSONの記法は、C、C++、Java、Python、Perlなど、多くのプログラミング言語に精通したプログラマーにとって馴染み深いものとなっています。 JSONドキュメントのサンプル 以下は、書籍情報を格納した典型的なJSONドキュメントの例です。 { book: [ { id: 01, language: Java, ed