Я создаю консольное приложение 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());
}
Ответ 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 (:)), который выполняет очистку после того, как вы закончите.