我正在编写一个小程序,允许用户查询包含帐户信息的数据库。数据库只是一个简单的文本文件。我遇到的问题是我的函数假设查看字符串是否包含关键字,有时会产生重复的结果。
这是我的代码:
public void actionPerformed(ActionEvent arg0) {
// Clear the text area.
textAreaRecords.setText("");
String keyword;
String[] keywords;
String[] parts;
String line;
String record = "";
boolean recordFound = false;
// Get keywords from field.
keyword = textFieldKeywords.getText();
keywords = keyword.split(" ");
// Open the file and read form it.
try {
FileReader fReader = new FileReader("Passwords.txt");
BufferedReader reader = new BufferedReader(fReader);
while((line = reader.readLine()) != null) {
parts = line.split("\t");
for(int i = 0; i < keywords.length; i++) {
if(parts[0].contains(keywords[i]))
recordFound = true;
}
if(recordFound) {
if(parts.length == 5)
record += parts[0] + "\t" + parts[1] + "\t" + parts[2] + "\t" + parts[3] + "\t" + parts[4] + "\n";
else
record += parts[0] + "\t" + parts[1] + "\t" + parts[2] + "\t" + parts[3] + "\n";
textAreaRecords.append("Account \t Username \t Password \t Email \t Notes\n\n");
textAreaRecords.append(record);
}
}
}catch(Exception e) {
e.printStackTrace();
}
}
重复结果的示例......
数据库包含:
BT username password email someOtherNotes
Gmail username password email someOtherNotes
Gmail OtherGmail password email notes
提供的关键字:
Gmail
计划结果:
BT username password email someOtherNotes
Gmail username password email someOtherNotes
出了什么问题,我该如何解决?
答案 0 :(得分:0)
一旦找到匹配,您就会将recordFound
切换为true
。如果读取下一行,则recordFound
的值不会重置为false
,这意味着从那一刻开始,您将始终输入上一个if
语句。
只需在recordFound = false
循环中添加while
作为第一个语句,您的问题就应该得到解决。
话虽如此:
actionPerformed
方法中读取文件并解析其全部内容。对于一个小文件,这将运行得非常快。但是一旦文件变大,读取文件将花费更多时间。在此期间,当您阻止UI线程时,您的UI无法更新。有关详细信息,请参阅Concurrency in Swing教程。finally
块中完成,也可以使用从JDK7开始提供的try with resources构造(有关详细信息,请参阅this tutorial)。