2012-03-05 2 views
5

현재 일부 파일을 읽으려면 버퍼링 된 스트림을 사용하고 있습니다. 그 사이에 심볼이 바이트 인 수학 처리를합니다.DataInputStream DataOutputStream 성능

읽으려면 :

InputStream input = new FileInputStream(outputname) 
input.read(byte[] b,int off,int len) 

작성하려면

OutputStream output = new BufferedOutputStream(
          new FileOutputStream(outputname), 
          OUTPUTBUFFERSIZE 
         ) 
output.write((byte)byteinsideaint); 

는 지금은 일부 헤더 데이터를 추가하고, 너무 짧은 문자를 지원해야합니다. DataInputStreamDataOutputStream을 사용하여 다른 유형의 바이트를 직접 변환하지 않으려 고하며 성능이 무엇인지 궁금합니다.

내가 데이터 버퍼링의 장점을 유지하기 위해

OutputStream output = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream(outputname), 
            OUTPUTBUFFERSIZE 
          ) 
         ); 

를 사용해야합니까 또는 당신은 사이에 BufferedOutputStream를 추가해야

OutputStream output = new DataOutputStream(
          new FileOutputStream(outputname) 
         ) 

답변

7

을 사용하기 충분하다. DataOutputStream은 어떤 캐싱도 구현하지 않습니다 (이는 좋은 점입니다 : 관심사 분리). 기본이되는 OutputStream을 캐싱하지 않으면 성능이 매우 떨어집니다. writeInt()과 같은 가장 간단한 방법조차도 4 개의 개별 디스크 쓰기가 발생할 수 있습니다.

지금까지 볼 수있는 한 write(byte[], int, int)writeUTF(String)은 하나의 byte[] 청크에 데이터를 쓰고 있습니다. 다른 것은 원시 값 (예 : int 또는 double)을 바이트 단위로 씁니다.

+0

이것은 완전히 도움이되었습니다. 고마워요 ^^ – Lake

1

중간에 BufferedOutputStream이 꼭 필요합니다.

나는 성능에 대해 관심을 주셔서 감사합니다, 나는이 개 제안이 있습니다

  1. 자바 압축하여 스트림을 축소합니다. 유용한 기사는 here입니다.
  2. 상속 대신 컴포지션을 사용합니다 (어쨌든 권장되는 방법입니다). getInputStream() 및 getOutputStream() 메서드를 사용하여 PipedInputStream 및 PipedOutputStream이 서로 연결된 파이프를 만듭니다. Pipe 객체를 스트림이 필요한 항목에 직접 전달할 수는 없지만 스트림의 반환 값을 전달할 수 있습니다. get 그것을하는 방법.
+0

고마워요. 내 작업의 요구 사항에 따라 난폭 한 압축을해서는 안된다. – UmNyobe

+0

GZip * 스트림은 원시 호출을 통해 많은 메모리를 사용하기 때문에 Java에서 큰 문제가있다. 아마도 LZ-4가 더 좋습니다. – claj

관련 문제