2013-04-01 3 views
2

Я совершенно не знаком с программированием, поэтому у меня возникли трудности с решением моих собственных ошибок. Кто-то посоветовал мне попробовать его на этом веб-сайте, поэтому я подумал, почему бы не сделать это.ObjectInputStream.readObject() дает EOFException

Другие сообщения, которые я нашел относительно этой ошибки, не выглядели очень актуальными: большинство из них были людьми, которые советуют закрыть входной поток, но мой код уже делает это.

Что я хочу этого делать: Записать фото-объект под названием «фото» в файл под названием «test.ser». Затем прочитайте файл «test.ser» И верните путь к объекту («фото») в «test.ser» обратно ко мне.

Что он на самом деле делает: Записывает объект «с фотографией» под названием «test.ser». Читает «test.ser», возвращает исключение EOFException и никакого пути.

Возвращение пути на самом деле не очень важно, если оно возвращает мне что-то ценное. Но я получаю ту же ошибку, когда я использую «System.out.println (фото)» или «photo.getId()».

Я не очень уверен, что мне нужно, чтобы вставить здесь, так что я буду размещать два Try/Catch-эс, что я использую для сериализации и десериализации объекта:

Сериализация объекта:

File test = new File("path.../something.ser"); 
    Photo photo = new Photo(2, "..\\images\\2.jpg", getImage("..\\images\\2.jpg")); 

    try { 
     FileOutputStream fos = new FileOutputStream(test); 
     ObjectOutputStream out = new ObjectOutputStream(fos); 

     if (!test.exists()) { 
      test.createNewFile(); 
     } 
     out.writeObject(photo); 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

десериализации объекта:

 try { 
     FileInputStream fis = new FileInputStream(test); 
     ObjectInputStream in = new ObjectInputStream(fis); 

     in.readObject(); 

     photo = (Photo)in.readObject(); 
     photo.getPath(); 
     in.close(); 

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

И ошибка:

run: 
null 
java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
    at view.Main.<init>(Main.java:103) 
    //103 is the line that casts the input object to a Photo object. 

BUILD SUCCESSFUL (total time: 1 second) 

От того, что я чувствую, ошибка возникает, когда я пытаюсь ввести литой объект - который я получаю через метод readObject - в объект класса «фото». По крайней мере, это то, на что ссылается ошибка в строке 103.

Я читал в другом месте, что ошибка означает, что я «пытался читать больше объектов, чем там есть». Не уверен, что это значит, потому что я просто хочу, чтобы он прочитал 1 изображение - которое должно быть внутри объекта - и вернет его местоположение.

Также я прочитал, что ObjectInputStream никогда не возвращает null, если только я не дал это значение где-то. Но на самом деле он возвращает (?) «Null», хотя мой код не содержит нулевого значения ...

Я был у него в течение нескольких дней (да, я просто так плохо) и все еще нет удачи.

+0

Связано: [EOFException при чтении файлов с ObjectInputStream] (http://stackoverflow.com/q/12684072/1065197) –

ответ

4

Вы читаете это дважды:

in.readObject(); 

    photo = (Photo)in.readObject(); 

Удалить первую строку. Также вам не нужно создавать файл. Выходной поток сделает это за вас.

+0

Пожалуйста, обратитесь к ссылке, которую я опубликовал в своем комментарии к вопросу OP. В ответах там подробно объясняется проблема. Кстати, «EOFException» является нормальным в этом случае. –

+0

Проблема в вашей ссылке кажется иной. Здесь код записывает один объект Photo, но пытается прочитать дважды из потока (я думаю, по ошибке). – jdb

+0

Похоже, ты прав. –