2010-08-10 2 views
0

"HashMap"종류의 객체를 파일에 쓰려고 시도하고 있습니다. & 프로그램을 다시 실행할 때이를 복구하십시오. 하지만 그 개체를 읽을 때 개체가 파일에서 읽히지 않을 때 EOFException이 발생했습니다. FileOutputStream & ObjectOutputStream에 대한 객체를 작성할 때 flush() & close() 메서드를 사용합니다. 또한 내 파일에 대해 OutputStream & InputStream을 함께 만듭니다. 여기 내 코드입니다 :파일에 쓰는 동안 Java Object Stream에 문제가 발생했습니다.

DataOutputStream outToFile; 
DataInputStream inFromFile; 

ObjectOutputStream writeTableToFile; 
ObjectInputStream readTableFromFile; 
File tableFile; 

public DNS(){ 
    try { 
     tableFile = new File("table.txt"); 
     outToFile = new DataOutputStream(new FileOutputStream(tableFile)); 
     writeTableToFile = new ObjectOutputStream(outToFile); 

     inFromFile = new DataInputStream(new FileInputStream(tableFile)); 
     readTableFromFile = new ObjectInputStream(inFromFile); 
     HashMap table2 = (HashMap) readTableFromFile.readObject(); 
     if (table2 == null) 
      table=new HashMap(100); 
     else 
      table = table2; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    }catch(EOFException e){ 
     table=new HashMap(100); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

}

여기에 쓰는 객체에 대한 코드입니다

+0

같은 파일에 대한 입력 스트림과 동시에 출력 스트림이 동시에 열리나요? 이것은 좋은 생각입니까? 읽고 읽으려고 할 때 입력 스트림을 열고 닫으십시오. 출력 스트림을 작성하여 열어 쓸 때 닫은 다음 닫으십시오. –

답변

0

파일이 불완전한 것으로 보입니다. 귀하의 코드를 볼 때, 당신은 table.txt 파일을 만들고 그 후에 즉시 읽으려고합니다.

이 ctor에 :

new FileOutputStream(tableFile) 

파일을 덮어 쓰게됩니다. 나중에 읽으면 비어있게됩니다 (OOS의 헤더 정보 제외)

+0

감사합니다. 나는 프로그램의 끝에서 객체를 저장하는 방법으로 OutputStreams 초기화를 대체하고 문제가 해결되었다. 그러나 이와 같은 문제를 피하기 위해 OutputStreams와 inputStream을 한 곳에서 동시에 사용해서는 안됩니다. – sajad

+0

예, 한 번에 하나의 파일 만 열어 볼 수 있습니다. –

+0

읽기 및 쓰기가 모두 필요한 경우 RandomAccessFile을 사용하십시오. –

0

EOFException 파일이 불완전하다는 것을 의미

  table.put(NameField.getText(), IPField.getText()); 
      try { 
       //writeTableToFile.reset(); 
       writeTableToFile.writeObject(table); 
       writeTableToFile.flush(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

감사 사 야드. 따라서 flush() ed가 아니거나 close() ed이거나 예외가 어딘가에서 삼켰을 수도 있습니다.

+0

Mr! 내 코드에서 flush()를 사용했다. 또한 프로그램을 닫을 때 close()를 사용했습니다. 나는 그 파일을 보았다. 그것은 비어 있지 않습니다. – sajad

+0

방금 ​​새 책자를 작성 했으므로 책을 읽었을 때 비어 있었고 아직 쓰지 않았습니다. – EJP

관련 문제