2017-01-15 4 views
1

У меня возникла странная проблема, которую я, похоже, не понимаю. Я делаю программу, которая считывает данные из файла. Но когда я читаю данные, я сразу получаю исключение EOFException.FileInputStream.available() возвращает байты, но ObjectInputStream.available() возвращает 0

Итак, я проверил с .available(), если файл был пуст или нет. И у меня получился странный результат. FileInputStream сказал, что файл был заполнен (249 байт), но ObjectInputStream сказал, что файл пуст (или не может быть прочитан).

EOFException at: "int signatureSize = ois.readInt();"

 FileInputStream fin = new FileInputStream("input(signedbyLK).ext"); 
     System.out.println("fin available: " + fin.available()); 

     ObjectInputStream ois = new ObjectInputStream(fin); 
     System.out.println("ois avaiable: " + ois.available()); 

     int signatureSize = ois.readInt(); 
     byte[] sigBytes = (byte[]) ois.readObject(); 
     String text = (String) ois.readObject(); 
     ois.close(); 

EDIT: Я добавлять содержимое файла следующим образом:

 File newFile = new File("input(signedbyLK).ext"); 
     newFile.createNewFile(); 

     System.out.println("Succesfully created new file: " + newFile.getName()); 

     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(newFile)); 
     oos.writeObject(sigBytes.length); 
     oos.writeObject(sigBytes); 
     oos.writeObject(readInput()); 
     oos.close(); 

ответ

1

Вот что говорит Javadoc

Любая попытка чтения данных объекта, который превышает границы пользовательские данные , написанные с помощью соответствующего метода writeObject, вызовут исключение OptionalDataException, значение которого равно true. Необъектные чтения, которые превышают конец выделенных данных, будут отражать конец данных так же, как они указывают на конец потока : пошаговые чтения возвращают -1 в качестве байта или количество байтов read, а примитивные чтения будут вызывать EOFExceptions. Если не существует соответствующего метода writeObject, то конец по умолчанию сериализованные данные означают конец выделенных данных.

Кроме того, вы должны читать входной поток объекта в том же порядке, как и при сериализовать его

+0

Я отредактировал мой вопрос. Теперь вы можете видеть, в каком порядке я заполняю файл. – Guido

+2

Ваши прочитанные вызовы даже не соответствуют вызовам для записи. Ваш первый вызов записи - это объект, но ваше первое чтение - это int – Biu

+0

Вау, я этого даже не заметил. Спасибо! – Guido

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