java에서 Vector 클래스 설정에 대하여

연습문제가 사람의 정보를 받아서 입력하고 데이터에 저장하고 언제든지 볼수있는 프로그램을 만드는건데

    Vector vc = new Vector();

    if (file.exists()){
        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
        vc = (Vector) ois.readObject();
        ois.close();
    }

이런식으로 하는데 오류는

Exception in thread "main" java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2335)

    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2804)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at Ex7.main(Ex7.java:11)

이런식으로 나오네요... 뭐가문제인지 잘 모르겠습니다. 열혈 자바 김승현 저자 책에서 나온 문제인데 소스를 그대로 쳐도 이러네요... 도와주세요!!

1답변

  • 파일에서 Vector객체를 읽어들이는데 해당 파일에 Vector객체가 없는 경우입니다.

    다음 예제를 살펴 보세요. 파일에 Vector를 3개 쓰고, 그 파일에서 ObjectInputStream으로 Vector객체를 3번 읽어오는 예제입니다. 이 코드에서 29~31번째 줄을 지우면 똑같이 EOFException이 발생하네요.

    코드 밑에 보면 실행하기 버튼 있으니까 그거 눌러서 나오는 코드 실행기에서 실행해 보세요. 잘 동작할겁니다. 그리고 29~31번째 줄(oos.writeObject(us1);라고 적힌 부분)을 지우고 실행해 보세요. 올려주신것과 똑같은 Exception이 발생합니다.

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.Vector;
    
    public class ObjectStream {
    
        public static void main(String[] args){
    
            // ObjectOutputStream 을 이용한 객체 파일 저장
            FileOutputStream fos = null;
            ObjectOutputStream oos = null;
    
            // UserClass 에 이름과 나이를 입력하여 객체를 3개 생성한다.
            Vector us1 = new Vector();
            Vector us2 = new Vector();
            Vector us3 = new Vector();
    
    
            try{
    
                // object.dat 파일의 객체 아웃풋스트림을 생성한다.
                fos = new FileOutputStream("object.dat");
                oos = new ObjectOutputStream(fos);
    
                // 해당 파일에 3개의 객체를 순차적으로 쓴다
                oos.writeObject(us1);
                oos.writeObject(us2);
                oos.writeObject(us3);
    
                // object.dat 파일에 3개의 객체 쓰기 완료.
                System.out.println("객체를 저장했습니다.");
    
            }catch(Exception e){
    
                e.printStackTrace();
    
            }finally{
    
                // 스트림을 닫아준다.
                if(fos != null) try{fos.close();}catch(IOException e){}
                if(oos != null) try{oos.close();}catch(IOException e){} 
            }
    
    
            // 파일로 부터 객체 데이터 읽어온다.
            FileInputStream fis = null;
            ObjectInputStream ois = null;
    
            try{
    
                // object.dat 파일로 부터 객체를 읽어오는 스트림을 생성한다.
                fis = new FileInputStream("object.dat");
                ois = new ObjectInputStream(fis);
    
                // ObjectInputStream으로 부터 객체 하나씩 읽어서 출력한다.
                // (UserClass) 로 형변환을 작성해야 한다.
                // System.out.println 으로 객체의 구현된 toString() 함수를 호출한다.
                System.out.println( (Vector)ois.readObject());
                System.out.println( (Vector)ois.readObject());
                System.out.println( (Vector)ois.readObject());
    
    
            }catch(Exception e){
                e.printStackTrace();
            }finally{
    
                // 스트림을 닫아준다.
                if(fis != null) try{fis.close();}catch(IOException e){}
                if(ois != null) try{ois.close();}catch(IOException e){}
            }
    
    
        }
    
    }
    

    코드 출처: http://hyeonstorage.tistory.com/252

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.