基本上我有这个代码..我希望能够在文本文件中显示删除一行..
示例:
Gab 223-2587
Mark 221-5678
Reca 227-7589
Feb 224-8597
命令:
remove Mark
文本文件中的结果应为:
Gab 223-2587
Reca 227-7589
Feb 224-8597
我的问题是,它没有删除我要删除的行..并且文本文件变空..或者如果我添加联系人然后尝试删除现有联系人..该文件将只包含最近添加的联系人..
这是我的代码:
File inputFile = new File("C:/Users/Gab Real/workspace/CSc121/MyContacts.txt");
System.out.println(String.format("File.canWrite() says %s", inputFile.canWrite()));
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
Scanner scan = new Scanner(System.in);
String word = "";
String currentline = " ";
StringBuilder fileOutput = new StringBuilder();
while((currentline = reader.readLine()) != null) {
fileOutput.append(currentline + "\r\n");
}
PrintWriter out = new PrintWriter(inputFile);
out.println(fileOutput.toString());
if(word.startsWith("add")){
out.append(entries[1] + " " + entries[2] + "\r\n");
//out.println(out.toString());
//out.write("\r\n");
}
//my if condition to remove a line
else if (word.contains("remove")){
String currentLine;
while((currentLine = reader.readLine()) != null) {
// trim newline when comparing with lineToRemove
String trimmedLine = currentLine.trim();
if(trimmedLine.contains(entries[1])) continue;
out.append(currentLine + System.getProperty("line.separator"));
}
答案 0 :(得分:2)
PrintWriter out = new PrintWriter(inputFile);
AAARGH。请从不命名输出文件inputFile
...
另外,请勿对DOS换行符"\r\n"
进行硬编码。这使您的程序不可移植。
除此之外,你的程序逻辑完全被破坏了......
您已阅读第一个
中的所有行while((currentline = reader.readLine()) != null) {
您第二次尝试过滤线条失败,因为您已经在文件末尾,从您上面的第一次阅读开始。
两种解决方案:
在您需要之前,请不要阅读该文件,或者每次重读。
只将一次读入可修改的数据结构,例如LinkedList<String>
。做所有修改;最后一次把它写出来。
答案 1 :(得分:1)
您无法同时读取和写入同一文件。在创建PrintWriter
之前,先将所有内容都读入内存,或者写入另一个文件(然后,可能在完成后将其复制到原始文件中)。
此外,写完后,请务必.close()
作者。
哦,是的,你不能两次读同一个读者。如果您想从头开始阅读,请创建一个新的阅读器。
答案 2 :(得分:0)
您的计划混淆了一些问题。尝试将它们分开。
public static void main(String[] args) {
...
String command = ...; // take it from args somehow
String marker = ...;
...
if ('remove'.equals(command)) removeLine(marker);
else if...
...
}
void removeLine(marker) {
// open files as you already do
while((currentline = reader.readLine()) != null) {
if (currentLine.indexOf(marker) < 0) {
output.writeln(currentLine);
} // else the line is skipped
}
// close files
}