Я пытаюсь создать систему входа в систему на Java и сохранил информацию администратора в текстовом файле в следующем формате:
Hannah,Joshua,Female,373ac,admin123
Leena,Kevin,Female,3283c,admin123
Четвертый индекс (373ac) — это имя пользователя, а пятый (admin123) — пароль. Каждый администратор получит новое имя пользователя и отдельную строку в файле.
Каждый раз, когда администратор входит в систему, он вводит свое имя, и программа должна искать файл со строкой, которая начинается с его имени, и сравнивать имя пользователя и пароль, чтобы они могли войти в систему. Я думаю, что лучший способ - это двумерный массив. . У меня есть этот код до сих пор, но он не читает его как 2D-массив, а просто один массив со всеми строками. Как это:
[Hannah,Joshua,Female,373ac,admin123,Leena,Kevin,Female,3283c,admin123]
Не могли бы вы мне помочь?
public class ReadFile {
public static void main(String[] args) throws Exception {
BufferedReader bufReader = new BufferedReader(new FileReader("Admin.txt"));
ArrayList<String> listofLines = new ArrayList<>();
String line = bufReader.readLine();
while (null != (line = in.readLine())) {
listofLines.add(line);
}
bufReader.close();
int [][] map = new int[bufReader.size()][];
int q = 0;
for (int i = 0; i < map.length; q++) {
String[] rooms = bufReader.get(i).split(",");
map[i] = new int[rooms.length];
for (int w = 0; w < rooms.length; w++) {
map[q][w] = Integer.parseInt(rooms[w]);
}
System.out.println(Arrays.toString(map[q]));
}
}
}
Я внес изменения @mmartinez04
где переменная «in», объявленная в строке «in.readLine()» внутри цикла while.




Вы заполняете listofLines, но никогда не используете его
Вместо итерации на основе bufReader, почему бы не использовать listofLines?
Кроме того, почему вы используете как i, так и q в качестве индексов? Одного вроде достаточно
Обновлено: массив int[][] также должен быть String[][]
String [][] map = new String[listofLines.size()][];
for (int i = 0;i<map.length;i++){
String[] rooms = listofLines.get(i).split(",");
map[i] = new int[rooms.length];
for(int w = 0; w<rooms.length;w++){
map[i][w] = rooms[w];
}
System.out.println(Arrays.toString(map[i]));
}
Кроме того, если вы хотите сделать свой код более кратким
String [][] map = new String[listofLines.size()][];
for (int i = 0;i<map.length;i++){
map[i] = listofLines.get(i).split(",");
System.out.println(Arrays.toString(map[i]));
}
Для вашего bufReader попробуйте изменить код на этот
String line = bufReader.readLine();
while (line != null) {
listofLines.add(line);
line = bufReader.readLine();
}
Кажется, я получаю сообщение об ошибке «не могу найти символ» для listOfLines. Как я могу это исправить?
Извините, я написал listOfLines, но вы объявили его как listofLines, просто исправил
Исключение в потоке "main" java.lang.NumberFormatException: для входной строки: "Leena" ---- я получаю эту ошибку
Я решил ошибку readLine. Спасибо
Я не уверен, почему вы используете целочисленный массив. Вместо этого вы должны использовать массив String[][] и избавиться от Integer.parseInt(rooms[w]) и просто использовать room[w]
Извините, я новичок в Java и только что исправил это, но теперь печатается только вторая строка текстового файла.
Есть ли способ, которым обе строки могут быть напечатаны как [[Hannah,Joshua,Female,373ac,admin123],[Leena,Kevin,Female,3283c,admin123]]
да, удалите оператор System.out.println в цикле for и вместо этого поместите System.out.println(Arrays.deepToString(map)) после закрытия цикла for
Я все еще получаю только вторую строку текстового файла
Попробуйте использовать код, который я предоставил внизу моего ответа.
Итак, предположим, я просто хочу распечатать Ханну, как я могу это сделать?
Вы можете использовать Files.lines(), чтобы прочитать файл как Stream<String>.
static String[][] readFileAs2DArray(String fileName) throws IOException {
try (Stream<String> stream = Files.lines(Path.of(fileName), Charset.defaultCharset())) {
return stream
.map(line -> line.split(","))
.toArray(String[][]::new);
}
}
public static void main(String[] args) throws IOException {
String[][] result = readFileAs2DArray("Admin.txt");
for (String[] line : result)
System.out.println(Arrays.toString(line));
}
вывод:
[Hannah, Joshua, Female, 373ac, admin123]
[Leena, Kevin, Female, 3283c, admin123]
Есть ли способ получить доступ только к 373ac?
@HannahJoshua Вы можете получить доступ к 373ac с помощью result[0][3].
У меня есть еще одно сомнение, которое является частью основного вопроса. Когда пользователь вводит свое имя, я хочу, чтобы программа читала только эту строку файла и читала третий индекс. Как это возможно?
Вы не можете read only that line of the file. Другие варианты: (1) вы сначала читаете все строки и ищете оттуда. (2) вы сохраняете его в базе данных и ищете там;
Можете ли вы предоставить более подробную информацию об «одном массиве», который создает ваш код?