2010-07-29 2 views
9

크기가 350KB이고 오랜 시간이 걸리는 파일에서 개체를 deserialize하는 중입니다. 컴퓨터 과학 TA는 ObjectInputStream과 함께 Buffered 판독기를 사용하여 성능을 크게 향상시킬 수 있다고 말했습니다. 그러나 나는 이것에 대해 Google에서 아무 것도 찾을 수 없습니다.Buffered ObjectInputStream가 존재합니까?

답변

18

장식을 사용하여 입력 스트림을 버퍼링합니다. 이

InputStream in = ...; // your underlying stream (e.g. FileInputStream) 
    ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in)); 

처럼이 ObjectInputStream를 호출 할 때마다 같은 OS의 파일 읽기 시스템 호출로 기본 스트림 in를 호출하지 않도록합니다. 대신 각 호출은 데이터 블록 (기본적으로 8K)을 가져와 캐시하고 버퍼에서 읽습니다. 스트림에서 읽기가 이제 java의 로컬 메소드 호출이고 시스템 호출의 메소드 호출 오버 헤드가 자주 발생하지 않으므로 속도가 빨라집니다. 캐시 일관성 및 JIT 최적화도 성능 향상에 도움이됩니다.

+0

'ObjectInputStream'는 1K 버퍼에게 시간의 적어도 일부를 사용하므로,이 제안 여기에 제안 된 것과 같이 극적으로 효과가 없을 것입니다. – EJP

+0

@EJP이 솔루션은 'BufferedReader'의'readLine()'메소드와 같이 객체를 읽을 수있을만큼 효율적입니까? –

2

아니하지만 당신은 위의 생성자에 인자로 BufferedInputStream을 전달하여 스트림 INTPUT 버퍼 객체를 만들려면 하는 ObjectInputStream (에서의 InputStream) 생성자

를 사용할 수 있습니다.

InputStream file = null; 
try { 
    file = new FileInputStream("Out.test"); 
    InputStream buffer = new BufferedInputStream(file); 
    ObjectInputStream in = new ObjectInputStream(buffer); 
    vector = (Vector)in.readObject(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally{ 
    if(file != null) { 
     file.close(); 
    } 
} 

지갑 다음 링크 : 여기

파일로 직렬화 된 오브젝트를 판독하는 예이다

http://java.sun.com/docs/books/performance/1st_edition/html/JPIOPerformance.fm.html

+0

'file' 선언 행 다음에'try {'를 쓰고 싶을 수도 있고,'finally {file.close(); }'대신'in.close();'를 사용하십시오. –

+0

이 코드는'finally' 블록에서'file'이 선언되지 않았기 때문에 확실히 컴파일되지 않을 것입니다. – uckelman

+0

@uckelman 이제 코드를 컴파일해야합니다. 이전에는 ref 코드를 입력했지만 테스트/컴파일은하지 않았습니다. – YoK