Итерация с ObjectInputStream.readObject () из .txt-файла - PullRequest
0 голосов
/ 11 апреля 2019

У меня проблемы с чтением объектных данных из .txt-файла с использованием метода readObject () из ObjectInputStream.Я пишу несколько пользовательских объектов в .txt, чтобы сохранить пользователей, когда сервер для программы не работает, и запись работает нормально, хотя, когда я пытаюсь прочитать информацию обратно, я не знаю, как перебрать /прочитайте следующую строку в файле.

public void readObjectFromFile() {
        boolean cont = true;
        User user;

try {
            FileInputStream fileIn = new FileInputStream("files/userlist.txt");
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);


            while(cont){
                Object obj = objectIn.readObject();
                if(obj != null) {
                    registeredUsers.add((User)objectIn.readObject());
                    user = (User)obj;
                    userPasswords.put(user.getUsername(), user.getPassword());
                    System.out.println(user.getUsername());
                }else {
                    cont = false;
                }
            }

        }catch (Exception ex) {
            ex.printStackTrace();

        }
}

public void addUserToDatabase(User user) {
        try(FileOutputStream fos = new FileOutputStream("files/userlist.txt", true);
                ObjectOutputStream oos = new ObjectOutputStream(fos)){
            oos.writeObject(user);
            oos.write('\n');
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Я бы хотел построчно прочитать файл, сохранить информацию о каждой строке в объекте пользователя и сохранить ее в списке selectedUsers..

Ответы [ 3 ]

0 голосов
/ 11 апреля 2019

Вы уже получаете данные из файла? Я делал это раньше с файлами с разделителями трубы ("|"), поэтому: значение1 | значение2 | value3

Не уверен в составе вашего файла, но если вы уже читаете данные, вы можете перейти к следующим строкам и создать новые объекты User, например:

    private List <UserEntry> collectFileContents(InputStream is, String fileName) throws Exception {
    try {
        List <UserEntry> userEntries = new ArrayList <UserEntry>(); 
        String line = "";
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        br.readLine();
        while ((line = br.readLine()) != null) {
            if (line.length() > 0) {
                UserEntry entry = new UserEntry();
                try {
                    String[] lineValues = line.split("\\|",-1);
                    entry.setVal1(lineValues[0]);
                    entry.setVal2(lineValues[1]);
                    //etc..
                    userEntries.add(entry);
                } catch (ArrayIndexOutOfBoundsException  ex) {
                    //error handling here
                    continue;
                }
            }
        }
        return userEntries;
    }catch(Exception ex) {
        //error handling here
    }

}

Это должно создать список пользователей, и я сохраню их в БД другим способом. Но вы можете делать это как хотите. Также обратите внимание - в моем файле первая строка имеет заголовок. Так что этот код пропустит первую строку. Опять же, не уверен, как ваш файл настроен.

0 голосов
/ 12 апреля 2019

Хорошо, я решил это!

public void readUsersFromFile() {
        try {
            FileInputStream fileIn = new FileInputStream("files/userlist.dat");
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);
            boolean keepReading = true;
            try {
                while(keepReading) {
                    User user = (User)objectIn.readObject();
                    registeredUsers.add(user);
                    userPasswords.put(user.getUsername(), user.getPassword());
                    System.out.println(user.getUsername());
                    objectIn = new ObjectInputStream(fileIn);

                }
            }catch(EOFException e) {
                keepReading = false;
            }
        }catch (Exception ex) {
            ex.printStackTrace();

        }
    }
0 голосов
/ 11 апреля 2019

Проблема: Вы читаете дважды в цикле while.

  1. Первый вызов:
    objectIn.readObject ()
  2. Второй вызов:
    isteredUsers.add ((Пользователь) objectIn.readObject () );

Решение:

Не вызывать метод readObject () дважды, используя уже использованную ссылку.

Кроме функциональной проблемы, вы также можете исправить следующие вещи, чтобы сделать ваш код лучше:

  1. Не делайте цикл while настолько сложным.

  2. Нет необходимости использовать отдельный логический счетчик в цикле while.

  3. Просто введите один раз пользователю, а не несколько раз (во время самого вызова readObject ()).

Пожалуйста, используйте следующий код:

User user = null;
while((user = (User) objectIn.readObject()) != null){
                registeredUsers.add(user);
                userPasswords.put(user.getUsername(), user.getPassword());
                System.out.println(user.getUsername());
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...