прочитать строку в текстовом файле

скажем, у меня есть этот текст в моем текстовом файле:

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?


person pep    schedule 15.03.2016    source источник
comment
Этот код приведет к утечке ресурса infile в случае исключения.   -  person Raedwald    schedule 15.03.2016


Ответы (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.

Вот фрагмент кода:

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");
    }
}
person user2004685    schedule 15.03.2016
comment
о, на самом деле ничего не произошло. это все равно, как будто он даже не будет читать текстовый файл или что-то в этом роде. он пропустит условие if и while и просто перейдет к методу President(). - person pep; 15.03.2016
comment
@pep Надеюсь, вы вводите что-то вроде 18 в качестве номера избирателя вместо имени избирателя. В таком случае не должно ли быть info[2] вместо info[1]? - person user2004685; 15.03.2016
comment
о, я только что заметил, и теперь я отредактировал свой вопрос. на самом деле номер избирателя находится в информации [1], а информация [3] или 18 - это возраст :) и да, я попробую это, и я дам вам знать, если это сработает :) - person pep; 15.03.2016
comment
@pep Вы должны сначала прочитать файл в памяти, а затем принять ввод от пользователя. Проверьте обновленное решение. - person user2004685; 15.03.2016

Вызов infile.readLine() фактически считывает строку из файла, возвращает ее и переходит к следующей строке. Вы вызываете его дважды, один раз в условии цикла while:

while(infile.readLine() != null)

И снова в первой строке цикла:

line = infile.readLine();

Вы должны просто вызвать его один раз в условии цикла while и присвоить значение переменной line, например:

while((line = infile.readLine()) != null)
person rahsan    schedule 15.03.2016
comment
Я думал, что упомянул то же самое в своем ответе ниже? - person user2004685; 15.03.2016