У меня есть приложение, которое сериализует и читает/записывает некоторые пользовательские объекты в 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 не будет иметь к этому никакого отношения. Есть ли у кого-нибудь опыт работы с «призрачными» файлами, которые, кажется, есть, но нет? Или это кажется удаленным, но не так ли?
Это запутанная проблема. Невозможно воспроизвести.
Ум, возможно, 'IOException' является« Файл не найден ». –
Первое правило просить о помощи в SO - опубликовать трассировку стека _entire_. Независимо от того, обратите внимание, что EOF встречается в 'ObjectInputStream $ PeekInputStream', поэтому OIS - это, например,« заливка насоса ». Очевидно, что файл не содержит достаточного количества данных для создания полного объекта и является либо пустым, либо поврежденным, либо заблокирован исключительно другим процессом, что объясняет, почему вы не можете его удалить. –
@BrianRoach, извините. Я забыл добавить некоторые важные детали к вопросу. Но 'IOException' не будет из файла не найден. Пожалуйста, прочитайте приведенное выше изменение. – ryvantage