0

그래서 개체 스트림에서 해시 맵을 저장하거나로드하는 데 문제가 있습니다. 파일이 저장되고 어떤 정보를 저장하는 것을 볼 수 있습니다. 문제는 해시 맵을 읽으려고 할 때 EOF 오류가 발생합니다. 당신의 도움에 미리 감사드립니다.eofExeption with objectstream 및 hashmap

public synchronized void store(StoredObject storedObject) { 

    try { 
     String objectName = storedObject.getObject().getClass().getName(); 

     File file = new File(LOCAL_STORAGE_PATH + objectName); 
     boolean isNewFile = !file.exists(); 


     output = new ObjectOutputStream(new FileOutputStream(file)); 
     input = new ObjectInputStream(new FileInputStream(file)); 
     if (isNewFile) { 
      localStorage = new HashMap<String, StoredObject>(); 
     } else { 
      ///////////////////////// 
      ////does not work /////// 
      ///////////////////////// 
      localStorage = (HashMap) input.readObject(); 
     } 


     localStorage.put(storedObject.getKey(), storedObject); 

     output.writeObject(localStorage);; 
     output.flush(); 

    } catch (IOException ex) { 
     //Logger.getLogger(LocalServer.class.getName()).log(Level.SEVERE, "ioexception", ex); 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     Logger.getLogger(LocalServer.class.getName()).log(Level.SEVERE, "class missmatch", ex); 
    } 
    finally{ 
     try { 
      output.close(); 
      input.close(); 
     } catch (IOException ex1) { 
      Logger.getLogger(LocalServer.class.getName()).log(Level.SEVERE, "could not close connection", ex1); 
     } 
    } 

} 

오류 메시지 : java.io.ObjectInputStream.readObject0에서 java.io.ObjectInputStream의 $ BlockDataInputStream.peekByte (ObjectInputStream.java:2601) (ObjectInputStream에에서

java.io.EOFException . java : 1319) (java.io.ObjectInputStream.readObject (ObjectInputStream.java:371) , ServiceLayer.LocalServer.LocalServer.store (LocalServer.java:66) at ServiceLayer.LocalServer.LocalServerTEST.main (LocalServerTEST.java : 17)

나는 시도했다 : 그것 syncronized하게. 객체 (StoredObject)와 하위 객체는 직렬화 가능합니다.

답변

2

출력 및 입력 코드가 혼합되어 있습니다. 출력 및 입력 스트림을 동시에 생성합니다. new FileOutputStream(file)으로 전화하면 기존 파일이 바뀌므로 읽으려고하면 파일이 비어 있습니다.

출력 및 입력 코드를 두 가지 방법으로 이동하십시오.