Java читать поток ввода объекта в Arraylist? - PullRequest
6 голосов
/ 26 июня 2011

Предполагается, что приведенный ниже метод считывает двоичный файл в arrayList.Но получение java.io.EOFException:

at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at .... Read(Tester.java:400) 
at .... main(Tester.java:23)

Строка 23 в главном просто вызывает метод, строка 400 - цикл while ниже.Есть идеи?

private static void Read() {
    try {
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin"));
        while (objIn.readObject() != null) {
            list.add((Libreria) objIn.readObject());
        }
        objIn.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

Ответы [ 4 ]

9 голосов
/ 27 июня 2011

Согласно другим ответам вы читаете дважды в цикле. Другая ваша проблема - нулевой тест. readObject() возвращает ноль только в том случае, если вы написали ноль, а не в EOS, поэтому нет особого смысла использовать его в качестве теста завершения цикла. Правильное завершение цикла readObject():

catch (EOFException exc)
{
 in.close();
 break;
}
7 голосов
/ 26 июня 2011

Проблема в том, что вы вызываете readObject () дважды в цикле. Попробуйте вместо этого:

MediaLibrary obj = null;
while ((obj = (MediaLibrary)objIn.readObject()) != null) {
     libraryFromDisk.add(obj);
}
4 голосов
/ 26 июня 2011

Вы читаете объект во время теста:

while (objIn.readObject() != null)

Тогда вы читаете следующий объект в:

libraryFromDisk.add((MediaLibrary) objIn.readObject());

Итак, за одну итерацию вы должны прочитать только один объект

private static void Load() {
    try {
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin"));
        Object object = objIn.readObject();
        while (object != null) {
           libraryFromDisk.add((MediaLibrary) object);
           object = objIn.readObject();

        }
        objIn.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
}
0 голосов
/ 20 июля 2013

Вы можете попробовать это. Удачи!

private static void Load() {
try {
    ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin"));
    boolean check=true;
    while (check) {

try{
object = objIn.readObject();
libraryFromDisk.add((MediaLibrary) object);
}catch(EOFException ex){
check=false;
}

    }
    objIn.close();
} catch(Exception e) {
    e.printStackTrace();
}
}
...