2014-02-09 4 views
1

파일에서 객체를 읽도록 작성한 메서드가 작동하지 않아서 available() 메서드가 작동하지 않는 이유를 알아 내려고 노력했습니다. 파일이 완전하게 읽히지 않았더라도 ObjectInputStream의 0으로 설정되었습니다. 대신에 FileInputStream available() 메서드를 사용하여 EOF를 확인한 후에이 메서드가 작동했습니다.ObjectInputStream available() 메서드가 예상대로 작동하지 않음 (Java)

FileInputStream에서 작동하는 동안 ObjectInputStram에 대한 메서드가 작동하지 않는 이유는 무엇입니까?

여기에 코드입니다 :

public static void getArrFromFile() throws IOException, ClassNotFoundException { 
    Product p; 
    FileInputStream in= new FileInputStream(fName); 
    ObjectInputStream input= new ObjectInputStream(in); 
    while(in.available()>0){ 
     p=(Product)input.readObject(); 
     if (p.getPrice()>3000) 
      System.out.println(p); 
    } 
    input.close(); 

P.S- 나는이()에 사용할 수 대신 EOF 예외를 사용해야합니다 읽었습니다,하지만이 작동하지 않는 이유를 난 그냥 알고 싶어요.

감사합니다.

답변

1

available() 메서드는 블로킹없이 읽을 수있는 바이트 수만 알려줍니다. 정규 코드에서는 그다지 유용하지 않지만 사람들은 이름을보고 잘못되었다고 생각합니다.

약자로 available()을 사용하지 마십시오. 올바른 방법이 아닙니다. 스트림은 -1을 반환하거나 ObjectInputStream의 경우 EOFException을 던지는 것과 같이 다르게 끝나는 것으로 표시합니다.

3

javadoc에서 말한 것처럼 available()을 읽을 수있는 바이트 수를 추정하여을 차단합니다. 기본 InputStream 구현은 유효한 추정이므로 항상 0을 반환합니다. 그러나 그것이 반환하는 것이 무엇이든, 그것이 0을 반환한다는 사실이 더 이상 읽을 것이 없다는 것을 의미하지는 않습니다. 단지 스트림이 블로킹없이 적어도 하나의 바이트가 읽혀질 수 있다는 것을 보증 할 수 없다.

+0

답변을 주셔서 감사합니다.하지만 여전히 차이는 없습니다. 이 FileInputStream에 대한 ObjectInputStram에없는 방법 일을 왜 작동 않습니다 동안? – Mapisto

+0

어떤 이유로, ObjectInputStream은 블록하지 않고 일부 바이트를 읽을 수 있다고 보장 할 수 없으며 (또는 그러한 보증을 제공하지 않기 때문에), FileInputStream은 차단할 수 있습니다. 사용 가능한() 클래스가 무엇을하는지 정확히 이해하려면이 두 클래스의 코드를 살펴 봐야합니다.()을 사용할 수는 거의 절대 유용하고 확실히이 경우는 없기 때문에 그러나 이것은 꽤 쓸모가 없다. –

1

이것은 명확하게 문서화되어 있지 않지만 경험상 동적 데이터와 관련이 있다는 것을 깨달았습니다. 클래스에 정적으로 형식이 지정된 데이터 만있는 경우 available()은 크기를 예측할 수 있습니다. 개체에 목록 등과 같은 동적 데이터가있는 경우 해당 추정을 수행 할 수 없습니다.

+0

StackOverflow에 오신 것을 환영합니다! 직접적인 대답이 아닌 질문 아래에 의견을 제시하십시오. – Rafael

관련 문제