我目前正在为学校编写项目,其中要求我读取和写入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);
}
但我相信搜索方法以字节而不是行号移动。谁能帮忙。在此先感谢:)
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();
}
}
答案 0 :(得分:7)
快速而肮脏的解决方案是使用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
当然,如果它是一个非常大的文件,这不是一个好主意。有关如何在这种情况下逐行复制文件的一些想法,请参阅this answer。
但是,无论您如何操作,如果要更改行的字节长度,都需要重写整个文件(AFAIK)。 RandomAcessFile允许您移动文件并覆盖数据,但不插入新字节或删除现有字节,因此文件的长度(以字节为单位)将保持不变。
答案 1 :(得分:1)
这是一个像这样的问题的链接,有一个很好的答案: I want to open a text file and edit a specific line in java
基本上,您不能只编辑该行,除非它的长度完全相同。
相反,您需要复制每一行,然后当您到达要更改的行的行号时,只需将新行放入旧行,而不是复制旧行。
我给你的链接有一个如何做到这一点的很好的例子。
我希望这有帮助......如果没有,请告诉我,我会在帖子上进一步阐述。祝你好运:)