2014-04-16 3 views
1

데이터 구조에 정의 된 일부 객체 목록 목록이 있습니다. List> someObject1 = new ArrayList();Java에서 ObjectInputStream을 사용하여 파일에서 객체 목록을 읽는 방법?

그리고 나는 fileXY 사용 기능 writeData는에 몇 someObject라는 항목을 작성했습니다 : 이제

void writeData(List <List<Integer>> someObject1, File XY) throws IOException { 
    try(ObjectOutputStream outFile = new ObjectOutputStream(new FileOutputStream(XY,true))) 
    outFile.writeObject(someObject1); 
    } 
    catch(IOException ex) { ex.printStackTrace(); } 
} 

나는 기능되어, readData 사용하여 읽으려고 :

void readData(File XY) throws IOException { 
    try (ObjectInputStream inFile=new ObjectInputStream(new FileInputStream(XY))) { 
    List <List <MyClass>> someObject2=(List <List <MyClass>>)inFile.readObject(); 
    } 
catch(IOException ex) { ex.printStackTrace(); } 
} 

를하지만 나에게 오류를주고있다 :

java.io.OptionalDataException 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1363) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 

아무도 도와 줄 수 있습니까? 이 데이터 구조를 읽는 동안 캐스팅에 문제가 있습니까?

이 객체의 단지 목록 있었다면 같은 일이리스트의 목록 객체에 대해 작동하지 않는 이유는, 내가

(List<MyClass>). 

와의 readObject()를 주조하여 읽을 수 있 었는가? 이것은 확실히 나를 위해 작동

public class MyClass implements Serializable { 
private long aa;  
private List <Integer> bb; 
public MyClass(long a,List <Integer> b) { 
    aa=a; 
    bb=b;   
} 
public long getA() {  
    return aa; 
}   

public List<Integer> getB() { 
    return bb; 
} 

}

+1

이 코드를 포함 할 수 있습니다 :

이 한 번 봐? –

+1

'MyClass'의 관련 부분도 포함 할 수 있습니까? 그것은 사용자 정의 readObject()/writeObject() 메소드가 있습니까? 그렇다면 보여주십시오. – EJP

+1

쓰기/읽기 후에'ObjectOutputStream'과'ObjectInputStream'을 닫는 것을 잊지 마십시오! – JNevens

답변

1

:

는 MyClass에의 개요입니다

public static final String FILE = "file.b"; 

public static class MyClass implements Serializable { 
    private long aa; 
    private List<Integer> bb; 

    public MyClass(long a, List<Integer> b) { 
     aa = a; 
     bb = b; 
    } 
} 

public static void main(String[] args) throws FileNotFoundException, IOException, 
     ClassNotFoundException { 
    List<List<MyClass>> list = new ArrayList<>(); 
    list.add(new ArrayList<>()); 
    list.get(0).add(new MyClass(5, new ArrayList<>())); 

    ObjectOutputStream outFile = new ObjectOutputStream(new FileOutputStream(new File(FILE))); 
    outFile.writeObject(list); 
    outFile.close(); 

    ObjectInputStream inFile = new ObjectInputStream(new FileInputStream(new File(FILE))); 
    List<List<MyClass>> list2 = (List<List<MyClass>>) inFile.readObject(); 
    System.out.println(list2); 
} 

참고 : 어떤MyClass를 추가하지 않은 경우에도이 작품 ~list.get(0)및 추가하지 않아도 목록에list.

  • 당신이 그것을 쓰기 후
  • 당신이 파일의 올바른 위치에 객체를 읽지 않는를 출력 스트림을 닫습니다 잊었 : 당신의 문제에 대한

    여러 가지 가능한 원인은 내 마음에 와서 . 파일에 여러 오브젝트가 기록 된 경우, 기록 된 순서대로 읽어야합니다.

  • 문제는 사용자 정의 클래스입니다

UPDATE :

어쩌면 당신은 당신의 직렬화 클래스 MyClass에 비 직렬화 속성을 사용합니다. 그렇다면 writeObject()readObject()을 재정의하여 이러한 클래스의 특성을 올바르게 serialize/deserialize해야합니다. 당신은`outFile`를 닫 곳 http://marxsoftware.blogspot.fr/2014/02/serializing-java-objects-with-non.html

+0

감사합니다. @Joffrey. writeObject 및 readObject 메서드를 재정의하지 않았습니다. 나는 MyClass에서 Serializable Interface만을 사용했다. – Kaur

+0

@Kaur 지금 당장은 이러한 메서드를 재정의하지 않는다는 것을 이해합니다. 그러나 직렬화 할 수없는 특성이있는 경우 작동하도록하려면 그렇게해야합니다. 커스텀 클래스 'MyClass'에 다른 유형의 속성이 있습니까? – Joffrey

+0

아니요, 위의 cide에서 언급 한 것처럼이 두 속성을 가진 간단한 클래스가 있습니다. readObject()/writeObject() 메소드를 구현/재정의해야합니까? – Kaur