Создание страницы входа в консольное приложение 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)


arrow_upward
2
arrow_downward

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

  • Содержимое файла читается, но если достигнут конец потока, то код просто не обрабатывает этот случай корректно (или даже не рассматривает возможность его обработки). В частности, строка 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

arrow_upward
0
arrow_downward

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

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

person atamanroman    schedule 06.09.2010