Java 从二进制文件中读取任意数量的对象

Java 从二进制文件中读取任意数量的对象,java,io,binaryfiles,Java,Io,Binaryfiles,好的,我有一个“Animal”类,它是抽象的,有子类“Dog”和“Bird”,我需要编写一个程序,从二进制文件中读取未知数量的动物对象 public static void main(String[] args) throws FileNotFoundException { readAnimals("birdsAndDogs.dat"); } public static List<Animal> readAnimals(String filename) { Lis

好的,我有一个“Animal”类,它是抽象的,有子类“Dog”和“Bird”,我需要编写一个程序,从二进制文件中读取未知数量的动物对象

public static void main(String[] args) throws FileNotFoundException {
    readAnimals("birdsAndDogs.dat");

}

public static List<Animal> readAnimals(String filename) {
    List<Animal> animals = new ArrayList<Animal>();
    ObjectInputStream ois = null;
    try {
        ois = new ObjectInputStream(new FileInputStream(filename));

        try {
            while (true) {
                Animal a =(Animal) ois.readObject();

                if (a instanceof Animal)
                    animals.add((Animal)a);
                System.out.println(a);
            }
        }
        catch (EOFException eof) {
            ois.close();
            ois = null;
            return animals;
        }
    }
    catch (Exception e) {
        return null;
    }
}   
}
publicstaticvoidmain(字符串[]args)抛出FileNotFoundException{
readAnimals(“birdsAndDogs.dat”);
}
公共静态列表readAnimals(字符串文件名){
列出动物=新建ArrayList();
ObjectInputStream ois=null;
试一试{
ois=新对象输入流(新文件输入流(文件名));
试一试{
while(true){
动物a=(动物)ois.readObject();
如果(动物的实例)
动物。添加((动物)a);
系统输出打印项次(a);
}
}
捕获(EOFEException eof){
ois.close();
ois=null;
归还动物;
}
}
捕获(例外e){
返回null;
}
}   
}
这是我第一次尝试读取二进制文件,所以请放轻松,代码可能相当混乱我不确定,但我的主要问题是我一直得到一个FileNotFoundExeption,但文件在同一个包和位置,有什么想法吗

代码本身的结构是否正确


感谢您在应用程序看到时提供的所有帮助

new FileInputStream("justADog.dat")
它在启动应用程序的目录中查找文件名。我非常怀疑你的申请是从你的班级所在的包中运行的


提供文件的完整路径或将文件移动到运行应用程序的位置。在Eclipse中,应用程序是从您的项目文件夹启动的。

它们位于同一个项目文件夹中,而且当我从属性获取完整路径时,我仍然有相同的问题。我正在尝试测试的二进制文件和所有类请仔细阅读答案。假设您在Eclipse上,将
二进制文件移动到项目的根目录下。将
.java
文件保留在各自的包中。好的,是的,我知道了,对不起,我是eclipse新手。src文件夹用作根目录吗?@user2745043
src
文件夹用于保存您希望在应用程序的类路径(eclipse称之为构建路径)中找到的文件。将
.dat
文件放在项目(无论您的项目叫什么)文件夹中。