Как читать из текстового файла в массив объектов - PullRequest
0 голосов
/ 09 июня 2019

Итак, я просмотрел пару решений, но ни одно из них не помогло мне. Спасибо за некоторых людей, я получил бесконечный цикл прямо в конце, но он все еще не работает для меня. Я хочу прочитать файл "output.txt" в список объектов. Поэтому я предоставляю оставшиеся коды, так как думал, что они вообще не помогут ...

try {
            List<House> listH = new ArrayList<>();
            boolean cont = true;
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("output.txt"));
            while(cont)
            {
                House house = (House) ois.readObject();
                if(house != null)
                    listH.add(house);
                else
                    cont = false;
            }
            ois.close();
            mainmenu();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

Код написания:

try {
            FileWriter writer = new FileWriter("output.txt");
            for(House str : listH)
            {
                writer.write(String.valueOf(str) + "\n");
            }
            writer.close();
            System.out.println("Successful writing");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Couldn't write");
        }

Дом Объект:

public class House {
    String address;
    double area;
    boolean garage;

    public House(String address, double area, boolean garage){
        this.address=address;
        this.area = area;
        this.garage = garage;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }

    public boolean isGarage() {
        return garage;
    }

    public void setGarage(boolean garage) {
        this.garage = garage;
    }

    @Override
    public String toString() {
        return address + ";" + area + ";" + garage;
    }
}

Сообщения об ошибках следующие:

java.io.StreamCorruptedException: неверный заголовок потока: 3134313B в java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:866) at java.io.ObjectInputStream. (ObjectInputStream.java:358)

Ответы [ 2 ]

1 голос
/ 09 июня 2019

У вас есть три основные проблемы:

  1. Ваш цикл while бесконечен и может вызвать ошибку переполнения стека, проверьте условие, что в файле есть еще одна строка / объект для чтения, прежде чем он продолжится,
  2. Код, который читает файл, преобразуется непосредственно в объект House, это сильно зависит от формата записи файла, любая ошибка приведет к неудачному чтению.
  3. Другая часть проверки состоянияесли house is null, то выходит из всего процесса чтения, поэтому, если по какой-либо причине существует один null house, все дома после того, как он не будет прочитан. Для более конкретного ответа мне может понадобиться структура класса House и процесс, используемый для создания выходного файла.. Иначе используйте hasnext в условии while и readline, чтобы «вручную» построить домашний объект из строковых значений.
0 голосов
/ 09 июня 2019

Это здесь:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("output.txt"));

противоречие само по себе. Видите ли, когда вы сериализуете Java-объекты через стандартный механизм Java, вы получаете байт . Двоичные данные.

Таким образом:

  • либо ваш файл имеет неправильное расширение (и является двоичным, а не текстовым) ИЛИ:
  • все, что у вас есть в этом файле ... это не двоичные данные.

Исключение означает, что второй случай более вероятен.

Другими словами: проверьте, что действительно находится в этом файле "output.txt". Очевидно, что не результат сериализации объектов Java.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...