我有一个文本文件,其中包含客户端数据,ID,名称和姓氏,余额和日期,文本文件中有一个客户端包含4行,然后有一个空格,另一个客户端数据开始,依此类推。
ID:33
Client: Michael Reedus
Balance: 30000 Eur
Date: 32.03.2019
ID:34
Client: Michael Snow
Balance: 31900 Eur
Date: 32.03.2019
我需要为特定的客户ID块创建行替换,以避免在不使用ID的情况下为其他人替换同一行。
我试图实现一个想法,即当代码找到我需要的ID时,它就停在那里,例如跳到下一行并编辑该行,但是,我丢失了所有其他行,但我要替换的行除外。 / p>
private static void updateLine(String fails, String ID, String toUpdate, String updated) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(fails));
String line;
String input = "";
while ((line = file.readLine()) != null) {
if (line.equals(ID)) {
line = file.readLine();
input += line + System.lineSeparator();
input = input.replace(toUpdate, updated);
}
}
FileOutputStream os = new FileOutputStream(fails);
os.write(input.getBytes());
file.close();
os.close();
}
我希望得到
ID:33
Client: Michael Jordan
Balance: 30000 Eur
Date: 32.03.2019
不是
Client: Michael Jordan
答案 0 :(得分:1)
您遇到困难的原因有很多,以下是一些原因:
if (line.equals(ID)) {
line = file.readLine();
input += line + System.lineSeparator();
正如您在上面的少量代码中看到的那样,您实际上是在使用刚刚读入的行,然后直接应用到要写入文件的String中。这里的数据没有变化。应该是:
if (line.equals(ID)) {
line = file.readLine();
input += updated + System.lineSeparator();
打开另一罐蠕虫。如果提供的原始名称与提供的ID号不匹配怎么办。也许是输入错误。在更新文件中的特定项目之前,请将其与 toUpdate 参数中包含的内容进行比较:
if (line.equals(ID)) {
line = file.readLine();
if (line.equals(toUpdate)) {
input += updated + System.lineSeparator();
}
下一行确实让我感到困惑:
input = input.replace(toUpdate, updated);
您确实意识到 input 字符串变量最终将保存文件中包含的所有数据。如果要更新的项目位于多个ID编号不同的位置怎么办?上面的行将更改所有这些行。摆脱这些可怕的代码行。如果有的话,应仅将其应用于 line 变量(当前读入的文件行)。
下面,我发布了您的 updateLine()方法的修改版本。此版本允许您更改除 ID字段之外的任何客户端字段,例如:
updateLine("clients.txt", "ID:33", "Date: 32.03.2019", "Date: 31.03.2019");
updateLine("clients.txt", "ID:34", "Client: Michael Snow", "Client: John Smith");
updateLine("clients.txt", "ID:34", "Balance: 31900", "Balance: 1253672");
下面是代码(大部分是注释):
private static void updateLine(String fails, String ID, String toUpdate, String updated) {
// Try With Resources is used to autoclose the BufferedReader
try (BufferedReader file = new BufferedReader(new FileReader(fails))) {
String line;
String input = "";
while ((line = file.readLine()) != null) {
if (line.equals(ID)) {
// Append the ID to String
input+= ID + System.lineSeparator();
/* Loop through this client's data and make
changes where necessary... */
while ((line = file.readLine()) != null) {
/* If we get to this point where we read an ID again
then we've gone too far. The item to update could
not be found under the supplied ID Number. */
if (line.startsWith("ID:")) {
// Append the original ID to String.
System.out.println("The item to update (" + toUpdate +
") could not be found under the ID of: " + ID);
// Add this line to string anyways.
input+= line + System.lineSeparator();
break; // Break out of this inner lop
}
// Does file line match the supplied toUpdate?
if (line.equals(toUpdate)) {
// Yes - Append the new item to String
input+= updated + System.lineSeparator();
break; // Get out of inner loop. Let main loop take over again.
}
else {
// Append the original item to String.
input+= line + System.lineSeparator();
}
}
}
else {
input+= line + System.lineSeparator();
}
}
// Re-Write File with new data
// Try With Resources is used to autoclose the Stream
try (FileOutputStream os = new FileOutputStream(fails)) {
os.write(input.getBytes());
os.flush();
}
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}
}