web-dev-qa-db-ja.com

Javaのテキストファイルの特定の行番号に書き込むにはどうすればよいですか?

私は現在、学校向けのプロジェクトを作成しています。このプロジェクトでは、txtファイルの読み取りと書き込みが必要です。正しく読み取ることはできますが、最後に追加されたFileWriterからしか書き込むことができません。最初に行のデータを削除してから新しいデータを書き込むことにより、行番号のtxtファイルの内容を上書きできるようにしたいと思います。私はこの方法を使おうとしました...

public void overWriteFile(String dataType, String newData) throws IOException
{
    ReadFile file = new ReadFile(path);
    RandomAccessFile ra = new RandomAccessFile(path, "rw");
    int line = file.lineNumber(path, dataType);
    ra.seek(line);
    ra.writeUTF(dataType.toUpperCase() + ":" + newData);
}

しかし、seekメソッドは行番号ではなくバイト単位で移動すると思います。誰でも助けることができます。前もって感謝します :)

P.S. file.lineNumberメソッドは、古いデータがあった正確な行を返すため、書き込む必要のある行番号がすでにあります。

編集:Soloutionが見つかりました!ありがとうみんな:)誰かが興味を持っているなら私は以下のソロレーションを投稿します

public void overWriteFile(String dataType, String newData, Team team, int dataOrder) throws IOException
{
    try
    {
        ReadFile fileRead = new ReadFile(path);
        String data = "";
        if(path == "res/metadata.txt")
        {
            data = fileRead.getMetaData(dataType);
        }
        else if(path == "res/squads.txt")
        {
            data = fileRead.getSquadData(dataType, dataOrder);
        }
        else if(path == "res/users.txt")
        {
            data = fileRead.getUsernameData(dataType, dataOrder);
        }
        else if(path == ("res/playerdata/" + team.teamname + ".txt"))
        {
            //data = fileRead.getPlayerData(dataType, team.teamname, dataOrder);
        }
        BufferedReader file = new BufferedReader(new FileReader(path));
        String line;
        String input = "";
        while((line = file.readLine()) != null)
        {
            input += line + '\n';
        }
        input = input.replace(dataType.toUpperCase() + ":" + data, dataType.toUpperCase() + ":" + newData);
        FileOutputStream out = new FileOutputStream(path);
        out.write(input.getBytes());
    }
    catch(Exception e)
    {
        System.out.println("Error overwriting file: " + path);
        e.printStackTrace();
    }
}
8
Elliot Lewis

手っ取り早い解決策は、Files.readAllLinesメソッドとFiles.writeメソッドを使用して、すべての行を読み取り、変更する行を変更し、ファイル全体を上書きすることです。

List<String> lines = Files.readAllLines(file.toPath());
lines.set(line, dataType.toUpperCase() + ":" + newData);
Files.write(file.toPath(), lines); // You can add a charset and other options too

もちろん、それが非常に大きなファイルである場合、それは良い考えではありません。その場合にファイルを1行ずつコピーする方法については、 この回答 を参照してください。

ただし、その方法に関係なく、行のバイト長を変更する場合は、ファイル全体を書き換える必要があります(AFAIK)。 RandomAcessFileを使用すると、ファイル内を移動してデータを上書きできますが、新しいバイトを挿入したり、既存のバイトを削除したりすることはできないため、ファイルの長さ(バイト単位)は同じままです。

8
Cyäegha

これは、このような質問へのリンクであり、すばらしい答えがあります。 テキストファイルを開いて、Javaで特定の行を編集したい

基本的に、まったく同じ長さでない限り、その行を編集することはできません。

代わりに、すべての行をコピーし、変更する行の行番号に達したら、古い行をコピーするのではなく、新しい行を挿入するだけです。

私があなたに与えたリンクは、これを行う方法についての素晴らしい例を持っています。

これがお役に立てば幸いです...そうでない場合はお知らせください。投稿についてさらに詳しく説明します。幸運を :)

1
Alex K