繁体   English   中英

Java:如何使用 DataInputStream 读取文件?

[英]Java: How to read a file using DataInputStream?

我有一个名为deserialize化的 function :

    public static Person deserialize(DataInputStream input) throws Assignment08Exception, IOException {
        Person new_person;
        try {
            while (true) {
                String name = input.readUTF();
                String surname = input.readUTF();
                long date = input.readInt();
                new_person = new Person(name, surname, new Date(date));
            }
        }
        catch (EOFException e) {
            e.printStackTrace();
        }
        return new_person;
    }

我正在尝试熟悉DataInputStreamDataOutputStream ,我查看了这个网站以获得一些帮助。 这个网站上有同样的代码部分,但它对我不起作用:它显然进入了无限循环。 所以我的问题是为什么有一段while (true)用于从.dat文件中读取,我应该在我的代码中进行哪些更改以使其正确读取文件,而不会陷入无限循环?

该网站上提到的代码部分: 在此处输入图像描述

编辑:

我稍微改变了我的代码:

Forgot to mention that the deserialize function is in the Person class and it's used in other function of PersonDatabase class also called deserialize (All classes and functions are named by my teacher and I can't change them). 现在我的Person.deserialize()看起来像这样:

    public static Person deserialize(DataInputStream input) throws Assignment08Exception, IOException {
        Person new_person = null;
        try {
            String name = input.readUTF();
            String surname = input.readUTF();
            long date = input.readInt();
            new_person = new Person(name, surname, new Date(date));
        }
        catch (EOFException e) {
            e.printStackTrace();
        }
        return new_person;
    }

我的PersonDatabase.serialize()看起来像这样:

    public static PersonDatabase deserialize(DataInputStream input) throws Assignment08Exception, IOException, ParseException {
        File myFile = new File("C:/Users/.../assignment8_db.txt");
        PersonDatabase new_db = new PersonDatabase(myFile);
        Person new_person = null;
        try {
            while (true) {
                new_person = Person.deserialize(input);
            }
        }
        catch (EOFException e) {
            e.printStackTrace();
        }
        new_db.personList.add(new_person);
        input.close();
        return new_db;
    }

编辑2:

I have a PersonTest.java class for tests, I create a .dat file there first, use a serialize() function on it and then the given deserialize function to "transfer" all data from .dat file to a .txt file.

PersonTest.java

    @Before
    public void before() throws IOException, ParseException {
        out = new DataOutputStream(new FileOutputStream("C:/Users/.../assignment8.dat"));
        in = new DataInputStream(new FileInputStream("C:/Users/.../assignment8.dat"));
        personDatabase = new PersonDatabase(file);
    }

    @Test
    public void serializeAndDeserialize() throws Assignment08Exception {
        personDatabase.serialize(out);
        try {
            PersonDatabase.deserialize(in);
        }
        catch (ParseException | IOException e) {
            e.printStackTrace();
        }
    }

与其检查 EOF,不如检查流的available()方法,如果数据可供读取,则该方法返回大于零的 integer。

    public static Person deserialize(DataInputStream input) throws Assignment08Exception, IOException {
        Person new_person = null;
            if (input.available() > 0) {
                    String name = input.readUTF();
                    String surname = input.readUTF();
                    long date = input.readInt();
                    new_person = new Person(name, surname, new Date(date));
                }
                
        return new_person;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM