读取文本文件中的字符串

时间:2016-03-15 14:35:06

标签: java bufferedreader file-handling

让我说我的文字文件中有这个文字:

VOTED/1/hannah/18
NOT VOTING/2/janice/20

我有这段代码:

File Orig_outFile = new File("C:\\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));

vNum=JOptionPane.showInputDialog("Enter voters number: ");
String line="";
String something="VOTED";
while(infile.readLine()!=null){
    line=infile.readLine();
    String [] info=line.split("/");

    if(info[1].matches(vNum)){
    while(info[0].matches(something)){
        JOptionPane.showMessageDialog(null, "Voter already voted or Voter not registered. Please try again");
        vNum=JOptionPane.showInputDialog("Enter voters number: ");
    }
    President();
    }
}
infile.close();

任务是用户需要输入选民的号码,然后阅读文本文件,然后如果发现文本文件中的info[0]包含VOTED,它将得到错误信息,需要再次输入其选民的号码。我假设我的错误是我使用了while循环两次?

2 个答案:

答案 0 :(得分:2)

实际上,您正在通过while阅读infile.readLine()中的一行,并通过再次执行line将下一行添加到字符串infile.readLine()

您最终只是从文件中读取第二行。您应该按如下方式更改while循环:

while((line = infile.readLine()) != null)

删除以下声明:

line = infile.readLine();

以下是更正后的代码段:

File Orig_outFile = new File("C:\\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));

vNum = JOptionPane.showInputDialog("Enter voters number: ");
String line = null;
String something = "VOTED";
while((line = infile.readLine()) != null) {
    String [] info = line.split("/");

    /* Assuming You Are Entering Voter's Number & Not Voter's Name */
    if(info[1].equalsIgnoreCase(vNum)) {
        if(info[0].equalsIgnoreCase(something)) {
            JOptionPane.showMessageDialog(null, "Voter already voted or 
                                          Voter not registered. Please try again");
            /* Please Note That You Are Currently Iterating File */
            /* If You Do This Here, You'll End Up Checking Same Records */
            /* You'll Have To Replace Outer `if` with `while` */
            vNum = JOptionPane.showInputDialog("Enter voters number: ");
        } else {
            President();
            break;
        }
    }
}
infile.close();

这是一个更清晰的方法来实现它:

  1. 阅读内存中的完整文件(最好是Map,并带有密钥 - >选民号码。)

  2. 从用户那里获取选民号码,并检查地图中是否存在。

  3. 如果地图中不存在,或者该值等于VOTED,请重复Step 2

  4. 以下是代码段:

    File Orig_outFile = new File("C:\\voters.txt");
    BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
    Map<String,String> map = new HashMap<>();
    String something = "VOTED";
    
    String line = null;
    while((line = infile.readLine()) != null) {
        String [] info = line.split("/");
        map.add(info[1],info[0]);
    }
    infile.close();
    
    while(true) {
        vNum = JOptionPane.showInputDialog("Enter Voter's Number: ");
        if(map.contains(info[1]) && !map.get(info[1]).equalsIgnoreCase(something)) {
            President();
            break;
        } else {
            JOptionPane.showMessageDialog(null, "Voter already voted or 
                                              Voter not registered. Please try again");
        }
    }
    

答案 1 :(得分:2)

调用infile.readLine()实际上从文件中读取一行,将其返回并移至下一行。你在while循环条件下调用它两次:

while(infile.readLine() != null)

再次在循环的第一行:

line = infile.readLine();

你应该在while循环条件下调用它一次并将值赋给line变量,如下所示:

while((line = infile.readLine()) != null)