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)

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


조회수 338


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

  • 2016년 06월 01일에 수정됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.
  • 2016년 02월 25일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close