如何从文本文件读取到对象数组

时间:2019-06-09 10:02:17

标签: java io

因此,我查看了几个解决方案,但没有一个对我有用。 感谢某些人,我最终获得了无限循环,但对我来说仍然无效。 我想将文件“ 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)     在java.io.ObjectInputStream。(ObjectInputStream.java:358)

2 个答案:

答案 0 :(得分:1)

您有三个主要问题:

  1. 您的while循环是无限的,可能会导致堆栈溢出 错误,请进行条件检查以确保还有另一条线/对象要 在文件继续读取之前被读取。
  2. 读取文件的代码直接投射到House对象,这 高度取决于文件写入的格式,任何错误都将导致 读取失败。
  3. 检查房屋是否为空的条件的其他部分出现 整个阅读过程中,所以如果有一个空房子 为什么所有房子都不会被读取 对于更具体的答案,我可能需要House类结构以及用于创建输出文件的过程。否则,在while条件中使用hasnext,并使用readline从字符串值中``手动''构造一个house对象。

答案 1 :(得分:0)

这里:

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

本身就是一个矛盾。您会看到,当通过标准Java机制对Java对象进行序列化时,最终将得到 bytes 。二进制数据。

因此:

  • 您的文件扩展名错误(并且是二进制文件,不是文本文件),或者:
  • 该文件中的所有内容……不是二进制数据。

该异常表明第二种情况更有可能。

换句话说:验证该“ output.txt”文件中的确实是什么。显然,不是序列化Java对象的结果。

(注意:当然,文件扩展名无关紧要,但这暗示表示文件确实与您期望的有所不同)