2014-01-21 4 views
1

У меня есть приложение, которое сериализует и читает/записывает некоторые пользовательские объекты в Java.EOFException из конструктора ObjectInputStream

Один из моих клиентов имеет конкретный файл (только один), который бросает EOFException всякий раз, когда файл считывается в конструктор ObjectInputStream.

java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) 
java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) 
java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
java.io.ObjectInputStream.(Unknown Source) 

EDIT: Извините, моя ошибка. Я забыл упомянуть, что я получаю файл через этот код:

File folder = new File(path); 
File[] files = folder.listFiles(); 

Таким образом, файл существует, насколько File#listFiles() является получение его.

Так file в коде ниже получен из цикла:

for(File file : files) 

Таким образом, IOException не должен быть из файла, не хватает (потому что почему бы listFiles() вернуть его?).

END-EDIT я полагал, что это может быть из-за глюка с неудавшейся-частичной записи объекта, так что я добавил код, чтобы удалить проблемный файл, если есть EOFException:

try (InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is);) { 
    // Do stuff... 
} catch (IOException e) { 
    if(e instanceof EOFException) { 
     file.delete(); 
    } 
    ErrorHandler.handleError(e); 
} 

Хотя этот код выполняется успешно, он фактически не удаляет файл. (Я все время вижу ошибку в журналах). Итак, я решил, что мой клиент будет вручную искать и удалять этот файл. Он искал, нашел его и удалил. Он подтвердил мне, что он успешно удалил файл. Однако даже после того, как он удалил его вручную, эта ошибка все еще появляется!

Хотя это Java-программа, мое подозрение в том, что это ошибка файловой системы Windows, поэтому Java не будет иметь к этому никакого отношения. Есть ли у кого-нибудь опыт работы с «призрачными» файлами, которые, кажется, есть, но нет? Или это кажется удаленным, но не так ли?

Это запутанная проблема. Невозможно воспроизвести.

+1

Ум, возможно, 'IOException' является« Файл не найден ». –

+1

Первое правило просить о помощи в SO - опубликовать трассировку стека _entire_. Независимо от того, обратите внимание, что EOF встречается в 'ObjectInputStream $ PeekInputStream', поэтому OIS - это, например,« заливка насоса ». Очевидно, что файл не содержит достаточного количества данных для создания полного объекта и является либо пустым, либо поврежденным, либо заблокирован исключительно другим процессом, что объясняет, почему вы не можете его удалить. –

+0

@BrianRoach, извините. Я забыл добавить некоторые важные детали к вопросу. Но 'IOException' не будет из файла не найден. Пожалуйста, прочитайте приведенное выше изменение. – ryvantage

ответ

0

Файл пуст или не содержит полного заголовка потока объектов. В любом случае он поврежден, и вы должны были обнаружить это, когда вы его написали.

Возможно, вам не удалось закрыть ObjectOutputStream при создании файла.

+0

Ошибка закрытия должна приводить к ошибке 'ObjectInputStream # readObject()', но эта ошибка генерируется конструктором, а не 'readObject()'. Вопрос в том, почему конструктор выдает ошибку? – ryvantage

+0

Вы ошибаетесь. Неисправность закрытия может привести к тому, что readObject() или конструктор могут вызвать исключение. Существует заголовок потока, который читает конструктор. См. Javadoc. Если его нет, вы получите то, что получили. То, что вы должны исследовать, - это неудавшееся закрытие. – EJP

Смежные вопросы