Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: YoosufОтветов: 2

Я создаю консольное приложение 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());
}
  • Переформатированный код; пожалуйста, верните, если неправильно. trashgod 06.09.2010

javafiletext-filesconsole-applicationlogin

Ответы

Ответ 1 · рейтинг 2 · Vineet Reynolds

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

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

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

Ответ 2 · atamanroman

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы