私は現在、学校向けのプロジェクトを作成しています。このプロジェクトでは、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();
}
}
手っ取り早い解決策は、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を使用すると、ファイル内を移動してデータを上書きできますが、新しいバイトを挿入したり、既存のバイトを削除したりすることはできないため、ファイルの長さ(バイト単位)は同じままです。
これは、このような質問へのリンクであり、すばらしい答えがあります。 テキストファイルを開いて、Javaで特定の行を編集したい
基本的に、まったく同じ長さでない限り、その行を編集することはできません。
代わりに、すべての行をコピーし、変更する行の行番号に達したら、古い行をコピーするのではなく、新しい行を挿入するだけです。
私があなたに与えたリンクは、これを行う方法についての素晴らしい例を持っています。
これがお役に立てば幸いです...そうでない場合はお知らせください。投稿についてさらに詳しく説明します。幸運を :)