2012-05-29 1 views
-1

'직렬화'장 끝에있는 연습 문제에서 제공 한 프로그램을 사용해 보았습니다..txt 파일에 개체 추가

이 프로그램에서는 클래스 인 Name 및 Address 유형의 데이터 멤버 두 개만 캡슐화하는 클래스 Person을 선언해야합니다. 그런 다음 키보드에서 일련의 이름과 주소를 가져 와서 개체를 만들고 파일에 써야합니다. 그러나 FILE ALREADY EXISTS가 있으면 기존 파일에 개체가 추가되어야합니다. 내 프로그램은 처음으로 완벽하게 실행하지만 첨부 된 기록을 다시 읽으려고 할 때 두 번째로, 나는 내이 연구의 비트가 발견 않았다

java.io.StreamCorruptedException: invalid type code: AC 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at Trial.main(Trial.java:66) 

예외를 얻을 StreamHeader이 할 수있는 그 오직 한 번만 쓰여지고 추가는 부패됩니다. 주변의 경로는 무엇입니까?
개체 작성 코드는 다음과 같습니다

try(ObjectOutputStream stream = new ObjectOutputStream(new BufferedOutputStream(Files.newOutputStream(filePath,WRITE,CREATE,APPEND)))) { 
     for(int i = 0;i<name.length;i++) { 
      Person aPerson = new Person(name[i],address[i]); 
      System.out.println(aPerson); 
      stream.writeObject(aPerson); 
      stream.reset(); 
      aPerson = null; 
     } 
     System.out.println("Writing Complete"); 
+0

확장자'.txt'는 파일에 사람이 읽을 수있는 텍스트가 들어 있음을 나타냅니다. 객체 스트림은 바이너리입니다. –

+0

직렬화가 텍스트를 생성하지 않습니다. 텍스트 파일에 오브젝트를 추가하지 않고'.txt' 파일 이름 확장자를 사용하지 않아야합니다. – EJP

답변

0

예, 내가 전에이 문제를 자신을 했어 ... 그것입니다 불가능, 불행히도.

개체를 목록에 배치하고 전체 목록을 한 번에 유지하면됩니다. 목록이 객체이기 때문에 쉽게 유지할 수 있습니다. 이것이 전체 내용이 메모리에 읽혀 지도록 요구하기 때문에 이것은 끔찍한 것이지만, 그것이 내가 아는 한 유일한 방법입니다.

다른 옵션 (권장)은 JSon과 같은 것을 사용하여 데이터를 커밋하는 것입니다. GSon은이 목적을 위해 아주 잘 작동합니다. 그런 다음 텍스트 파일에 커밋 될 수있는 객체를 마샬링 및 언 마샬링하면됩니다. 한 줄의 코드가 어느 방향 으로든 (JSon-string과 그 반대로) 이동해야하므로 매우 쉽습니다.

+0

@Mat Im 초심자 :) 내가 생각했던 (오히려 엉성한 방법) 객체를 다시 읽고 새로운 객체와 함께 다시 작성하는 것이 었습니다. 그러나 이것은 매우 효율적이지 않습니다 :) 그리고 당신은 연결 목록을 의미합니까? –

+0

예, 있습니다. 나는 LinkedList 또는 ArrayList 트릭을 할 것입니다. (우리는 모두 초보자입니다 :-)) 나는 성가신 것에 동의하지만, ObjectOutputStream은 여러 레코드를 추가하지 않습니다. –

+0

ArrayList에 대한 지식이 없습니다 :) –

0

이것은 작동합니다. 따라서 프로그램을 디버그하고 왜 그렇지 않은지 확인하십시오. 아마도 전화하지 마시오. reset()

public class ClassTest { 

    public static void main(String a[]) throws Exception { 
     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:/temp/foo.txt")); 
     oos.writeObject(new Test("foo", "bar")); 
     oos.writeObject(new Test("baz", "brr")); 
     oos.close(); 

     ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:/temp/foo.txt")); 
     System.out.println(ois.readObject()); 
     System.out.println(ois.readObject()); 
     ois.close(); 
    } 
} 

class Test implements Serializable { 
    private String fld1; 
    private String fld2; 
    public Test(String v1, String v2) { 
     this.fld1 = v1; 
     this.fld2 = v2; 
    } 

    @Override 
    public String toString() { 
     return "Test [fld1=" + fld1 + ", fld2=" + fld2 + "]"; 
    } 
} 
+0

Bozho 당신이 쓰는 것은 Test 객체이다. 출력 스트림을 닫지 않고 스트림을 닫고 다시 열 때이 문제가 발생합니다. 나는 또한 그런 문제가있다. java.io.StreamCorruptedException : 유효하지 않은 타입 코드 : AC any one help –

+0

@ user2433486 이것이 * point *입니다. 그는 당신에게 객체 쓰기 사이의 흐름을 닫지 말라고 말하고 있습니다. – EJP