Создание страницы входа в консольное приложение Java с использованием текстового файла

Я создаю консольное приложение Java, и мне нужно использовать файл блокнота (txt) для хранения PIN-кода, AccountNo и Balance. Когда пользователь вводит PIN-код (из BufferedReader), он должен пройти проверку из файла блокнота и войти в систему. Однако фрагмент кода, который я использовал ниже, отображает только ввод PIN-кода, и когда я нажимаю Enter, программа закрывается. Не могли бы вы сказать мне, в чем ошибка, которую я сделал здесь?

BufferedReader getIt = new BufferedReader(new InputStreamReader(System.in));
String userPIN = "";
try {
    // Open the file that is the first command line parameter
    FileInputStream fstream = new FileInputStream(
        "D:\\Studies\\BCAS\\HND\\Semester 1\\Programming Concepts\\Assignment\\AccountInfo.txt");
    // Get the object of DataInputStream
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    //Read File Line By Line
    System.out.println("Enter PIN");
    userPIN = getIt.readLine();

    while ((strLine = br.readLine()) != null) {
        // Print the content on the console#    
        if (userPIN.equals(strLine)) {
            System.out.println("You have login!");
        }
    }
    //Close the input stream
    in.close();
} catch (Exception e) {//Catch exception if any
    System.err.println("Error: " + e.getMessage());
}

person Yoosuf    schedule 06.09.2010    source источник
comment
Переформатированный код; пожалуйста, верните, если неправильно.   -  person trashgod    schedule 06.09.2010


Ответы (2)


Существует довольно много причин, по которым программа может просто завершаться или казаться успешной при выполнении программы (и, следовательно, успешно завершаться, не выполняя никакой полезной работы):

  • Содержимое файла читается, но если достигнут конец потока, то код просто не обрабатывает этот случай корректно (или даже не рассматривает возможность его обработки). В частности, строка while ((strLine = br.readLine()) != null) может привести к сценарию, в котором тело цикла не выполняется.
  • Условие else отсутствует внутри тела цикла while. Если ни одна из записей, введенных пользователем, не соответствует содержимому файла, код не обрабатывает условие, и результат неоднозначен. Для всех практических целей кажется, что вход в систему успешен, если предоставленный PIN-код отсутствует в файле.
  • Избегайте ненужного украшения Readers и Streams. BufferedReader in = new BufferedReader(new FileReader("foo.in")); достаточно для чтения символьных данных из файлов, и он предоставляет методы read и readline для использования.

PS: рекомендуется научиться защитно программировать, особенно при работе с файлы и потоки. Это помогло бы изолировать случаи в вашем коде, которые привели бы к неоднозначным/расплывчатым условиям.

person Vineet Reynolds    schedule 06.09.2010
comment
Я сохранил детали в файле блокнота в этом порядке (используя вкладку). Верно?ПИН аккаунтаБез баланса 1598 01-10-102203-0 95000 4895 01-10-102248-0 45000 9512 01-10-102215-0 125000 6125 01-10-102248 85000 - person Yoosuf; 06.09.2010
comment
@Yoosuf, похоже, вы используете TSV (значения, разделенные табуляцией) в своем файле. Это предположение отсутствует в вашем коде, следовательно, сбой. Вам нужно извлечь ПИН-код из каждой строки (т. е. из переменной strLine), а затем сравнить его с введенным ПИН-кодом. В противном случае вы будете сравнивать введенный PIN-код с каждой строкой в ​​файле, что неверно. - person Vineet Reynolds; 06.09.2010
comment
Мне также нужно восстановить баланс для каждого PIN-кода. Если вы не возражаете, пожалуйста, покажите мне формат, в котором я должен хранить детали. Или, если мой текущий способ в порядке, то как код должен сравниваться с каждой строкой. Большое спасибо!! - person Yoosuf; 06.09.2010

File.ReadAllLines было бы более удобно в вашем случае. Было бы неправильно ввести класс user, если вы идете по-доброму.

Если вы хотите сделать это самостоятельно, StreamReader (что занимает FileInfo) — хороший способ. Попробуйте создать его с помощью оператора using (:)), который выполняет очистку после того, как вы закончите.

person atamanroman    schedule 06.09.2010