2014-03-01 5 views
2

사용자 인터페이스를 사용하여 간단한 프로그램을 만들려고합니다. gui의 사용자는 Person Implements Serializable 클래스의 이름, 성 및 나이를 삽입합니다.파일에 여러 객체 쓰기 및 읽기

모든 것이 잘 작동하지만 한 사람, 첫 번째 사람 만 가능합니다. 그것은 내 파일에 새 개체를 보낼 때마다 파일 크기가 커지면서 실제로 파일에 기록됩니다.

문제는 파일 하나를 반환하는 파일을 읽을 때 myFile에 저장된 클래스 person의 모든 개체가 반환되기를 바랍니다.

쓰기 객체 버튼 :

try { 
    per = new Person(name, sur, age); 
    FileOutputStream fos = new FileOutputStream("myFile", true); 
    ObjectOutputStream oos; 
    oos = new ObjectOutputStream(fos); 
    oos.writeObject(per); 
    oos.flush(); 
    oos.close(); 
    //some other code here 
} catch (IOException e) { 
    //some code here 
} 

읽기 객체 버튼 : 어떤 정보를

try { 
    FileInputStream fis = new FileInputStream("myFile"); 
    ObjectInputStream ois; 
    ois = new ObjectInputStream(fis); 
    try { 
     rper = (Person) ois.readObject(); 
     ois.close(); 
     JOptionPane.showMessageDialog(null, "People:" + rper, "Saved Persons", JOptionPane.INFORMATION_MESSAGE); 
    } catch (ClassNotFoundException e) { 
     //some code here 
    } 
} catch (IOException e) { 
    //some code here 
} 

감사

여기 내 코드의 슬쩍입니다!

+0

배울 바랍니다 [코드를 포맷] (http://www.oracle.com/ technetwork/java/javase/documentation/codeconvtoc-136057.html). 이 질문은 읽을 수 없기 때문에 대부분의 사람들이 무시합니다. _your_ 코드가 무엇을하는지 어떻게 이해할 수 있습니까? –

+0

@BoristheSpider 나는 그것이 매우 기본적인 것 같아요, 심지어 위의 코드를 주석해야합니까? – Thms

+0

당신의 질문은 비록 여러 사람을 쓰거나 읽는 것에 관한 것이지만 루프에는 전혀 보이지 않습니다. –

답변

3

파일을 열 때마다 헤더가 기록됩니다. 입력 스트림 리더가 최초의 read 후에이 헤더를 검출하면 (자), 예외가 Throw됩니다. 예외 처리에서 "printStackTrace"호출이 없기 때문에 오류가 표시되지 않습니다.

스트림을 열 때 이후 호출에서 헤더가 기록되지 않도록 수정되었습니다. 이것을 열기 전에 파일의 존재 여부를 검사하고 이미 존재하는 경우 헤더를 쓰지 않는 ObjectOuputStream의 서브 클래스를 사용하십시오.

다음
 boolean exists = new File("myFile").exists(); 
     FileOutputStream fos = new FileOutputStream("myFile", true); 
     ObjectOutputStream oos = exists ? 
      new ObjectOutputStream(fos) { 
       protected void writeStreamHeader() throws IOException { 
        reset(); 
       } 
      }:new ObjectOutputStream(fos); 

단일 객체의 입력 스트림을 사용하여 모든 레코드를 다시 읽을 수 있습니다 ...

 FileInputStream fis = new FileInputStream("myFile"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     while(fis.available() > 0) { 
      try { 
       Object rper = ois.readObject(); 
       JOptionPane.showMessageDialog(null, "People:" + rper, "Saved Persons", JOptionPane.INFORMATION_MESSAGE); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 
     ois.close(); 
+0

대단히 감사합니다. – Thms

1
FileOutputStream fos = new FileOutputStream("myFile" , true); 

이 방법으로 파일에 append을 입력 할 수 없습니다. 간단한의 grammar of the serialization protocol :

stream: 
    magic version contents 

contents: 
    content 
    contents content 

가 여러 magic number 및 버전 필드와 때 디시리얼라이저는 오류가 발생이 발생하여 파일을 지르고있다. 커밋 된 모든 값을 읽고 새 파일에 복사하여 마지막에 새 항목을 작성해야합니다.