这个问题不同于通常的“我需要更换一行代码”的问题,至少我希望如此。
我想在一个名为accounts.txt的文本文件中编辑一行代码,而不是使用该行作为替换的标志,我需要使用它上面的行,因为文件的进展去“账号,平衡”。任何帮助表示赞赏!这是我到目前为止所拥有的。
public boolean modifyBalance(int accountNum, int newBalance) {
try {
FileReader fileReader = new FileReader("accounts.txt");
BufferedReader file = new BufferedReader(fileReader);
String line;
String input = "";
String flag;
boolean foundFlag = false;
Integer intInstance = accountNum;
flag = intInstance.toString();
while ((line = file.readLine()) != null) {
input += line;
if (line.equals(flag)) {
file.readLine();
input += "\n" + newBalance;
foundFlag = true;
}//end if
}//end while
return foundFlag;
} //end try
catch (IOException e) {
System.out.println("Input Failure in Modify Balance of Account"
+ " Repository.");
System.exit(0);
return false;
}
// look up inObj in the text file and change the associated
// balance to newBalance
}
答案 0 :(得分:0)
以下是需要考虑的一些事项。
如果文件很小,您可以将整个内容读入字符串数组(查看Java 7 Files类的javadoc)。然后你可以向前和向后走阵列进行改变。然后将修改后的文件写回。
如果文件很大,你可以从输入读取并一次写一行临时文件(但延迟输出一行,这样你就可以触发输入标志)。然后删除旧的输入文件并重命名临时文件。
答案 1 :(得分:0)
这是一种方法。
<强>过程强>:
- 将文件的所有行写成ArrayList
- 如果找到该标志,则标记该行号
- 如果您的行号不是-1,则找到该帐户,然后对ArrayList
进行更改,并将所有行写回文件。
public boolean modifyBalance(int accountNum, int newBalance)
{
int lineNumberOfAccount = -1;
boolean foundFlag = false;
BufferedReader file = null;
List<String> fileLines = new ArrayList<String>();
try
{
FileReader fileReader = new FileReader("accounts.txt");
file = new BufferedReader(fileReader);
String line;
String input = "";
String flag;
Integer intInstance = accountNum;
flag = intInstance.toString();
int lineNumber = 0;
while ((line = file.readLine()) != null)
{
fileLines.add(line);
System.out.println(lineNumber + "] " + line);
// input += line;
if (line.equals(flag))
{
lineNumberOfAccount = lineNumber;
foundFlag = true;
} // end if
lineNumber++;
} // end while
} // end try
catch (IOException e)
{
System.out.println("Input Failure in Modify Balance of Account" + " Repository.");
// don't exit here, you are returning false
// System.exit(0);
return false;
}
// Close the file handle here
finally
{
if (file != null)
{
try
{
file.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
// look up inObj in the text file and change the associated
// balance to newBalance
System.out.println("lineNumberOfAccount: " + lineNumberOfAccount);
// found the account
if (lineNumberOfAccount != -1)
{
int nextLine = lineNumberOfAccount + 1;
// remove the old balance
fileLines.remove(nextLine);
// add the new balance
fileLines.add(nextLine, String.valueOf(newBalance));
System.out.println(fileLines);
// write all the lines back to the file
File fout = new File("accounts.txt");
FileOutputStream fos = null;
BufferedWriter bw = null;
try
{
fos = new FileOutputStream(fout);
bw = new BufferedWriter(new OutputStreamWriter(fos));
for (int i = 0; i < fileLines.size(); i++)
{
bw.write(fileLines.get(i));
bw.newLine();
}
}
catch (IOException e)
{
System.out.println("Could not write to file");
return false;
}
// Close the file handle here
finally
{
if (bw != null)
{
try
{
bw.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
return foundFlag;
}
备注强>:
System.exit()
时要小心我在我的代码中对此进行了评论,因为如果您获得IOException
,可能不希望以这种方式退出程序。您也可以抛出异常或将其包装在RuntimeException
中,让调用代码处理它。newBalance
变量设为double
而不是int