2014-11-26 2 views
0

Я пытаюсь сохранить данные JAVA-программы в файле .db, но не работает. появляется следующее сообщение об ошибке сообщение:Сохранение данных в формате .db - java.io.File

"java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.<init>(Unknown Source) at server.server.main(server.java:27) Running"

Моя программа представляет собой модель клиент-сервер работает с Java RMI. У меня есть 2 клиента, 2 интерфейса, а затем несколько классов, включая класс сервера и класс реализации со всеми методами.

Метод «сохранить» в классе реализации следующим образом:

public void save() { 
    ObjectOutputStream out; 
    try { 
     out = new ObjectOutputStream(new FileOutputStream(new java.io.File("C:/Users/Myself/Desktop/Hospital.db"))); 
     out.writeObject(this); 
     out.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
} 

В классе сервера:

try { 
     ObjectInputStream in; 
     try {    
      in = new ObjectInputStream(new FileInputStream(new java.io.File("C:/Users/Myself/Desktop/Hospital.db"))); 
      read = (implementation)in.readObject(); 
      in.close(); 
      System.out.println(read); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      read = new implementation(); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      read = new implementation(); 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      read = new implementation(); 
      e.printStackTrace(); 
     } 

«Сохранить» метод затем используется в обоих клиентов.

+1

Насколько я вижу, вы _reading_ из файла, а не _writing_ – AlexR

+1

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

ответ

0

Трассировка стека исключений показывает enf файла при попытке читать заголовок потока объекта. Из этого мы можем определить несколько вещей:

  • проблема возникает при чтении объекта из файла C:/Users/Myself/Desktop/Hospital.db. Это не происходит во время написания объекта, так как в вашем описании проблемы появляется
  • След ObjectInputStream.readStreamHeader() показывает, что поток пытается прочитать его заголовок, поэтому это происходит в начале файла. Заголовок потока обычно состоит из двух коротких значений AC ED и 00 05, первые 4 байта в потоке
  • Тот факт, что EOFException выбрасывается до того, как заголовок потока может быть прочитан, подразумевает, что поток имеет менее 4 байтов. Я даже поспорю, что он пуст. Почему он пуст? Невозможно узнать, не видя больше вашего кода.

Итак, вкратце: ваш код пытается десериализовать объект из пустого файла, вызывая исключение, которое вы наблюдаете.

+0

Большое спасибо! теперь я понимаю – Zombie

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