2011-01-03 2 views
8

다른 사람의 코드를 읽습니다. 여기에 그 요지가 있습니다.FileOutputStream 대 ByteArrayOutputStream

클래스는 GZIPInputStream 및 GZIPOutputStream을 사용하여 파일을 압축하고 압축을 해제합니다.

다음은 압축 중에 무슨 일이 일어나는지를 보여줍니다. inputFileoutputFileFile 클래스의 인스턴스입니다.

FileInputStream fis = new FileInputStream(inputFile); 
GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputFile)); 

//the following function copies an input stream to an output stream 
IOUtils.copy(fis,gzos); 

//outputFile is the compressed file 
... 

이제는 압축 해제 중에 있습니다.

GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(inputFile)); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

//copies input stream to output stream 
IOUtils.copy(gzis,baos); 

//this method does as its name suggests 
FileUtils.writeByteArrayToFile(outputFile, baos.toByteArray()); 

//outputFile is the decompressed file 
... 

원래 프로그래머가 압축 해제시 압축시 FileOutputStreamByteArrayOutputStream을 선택 가능한 이유는 무엇입니까? 그것은 나를 혼란스럽게합니다.

좋은 이유가 있지 않는 한, 나는 그들이 미래의 혼란을 피하기 위해 일관성있게 바꾸고 있다고 생각합니다. 이것은 좋은 생각입니까?

+0

IOUtils 및 FileUtils는 프리 솔리 티브입니까, 커먼스 - io와 같은 lib입니까? – sblundy

+0

@sblundy, 그들은 commons-io 같은 라이브러리에서 왔습니다. – Russell

답변

11

다른 소스의 코드를 복사하여 붙여 넣은 것 같습니다. : -P 아니요, 압축 해제 된 데이터를 검사 할 필요가 없다면 압축과 압축 해제 모두에 BufferedOutputStream을 사용할 수 있습니다.

+0

그럴듯하게 들리네 – sblundy

+1

그럴 경우,'new FileOutputStream (outputFile)'대신'new BufferedOutputStream (outputFile)'을 사용 하시길 권합니다. 성능 향상이 있습니까? – Russell

+1

나는 이것이 나타날 가능성이 높습니다. 실제 솔루션이 BufferedInputStream 및 BufferedOutputStream을 사용할 때 성능을 향상시킬 수 있습니다. –

0

ByteArrayOutputStream 그에게 그녀에게 멋진 OutOfMemoryError을 줄 예정입니까?

진지하게, 그들은 아마 다른 시간에 행해졌 다. 가능한 경우 VCS 로그를 참조하십시오.

+0

좋은 아이디어. 로그를 확인해야 겠어. – Russell

4

ByteArrayOutputStream은 전체 내용을 자바 메모리 (byte[])에 저장하므로 더 많은 메모리 검색이 가능합니다. FileOutputStream은 디스크에 직접 씁니다. 따라서 메모리 hogging이 적습니다. 이 특별한 경우에는 ByteArrayOutputStream을 사용할 합당한 이유가 없습니다. 나중에 개별 바이트를 수정하지 않습니다. 나중에 파일을 변경하지 않고 기록됩니다. 따라서 불필요한 중간 단계입니다.

2

프로그래머는 압축하는 동안 FileInputStream을 사용하고 압축을 풀 때 버퍼를 사용했습니다. 그 이유는 파일을 읽는 데 실패 할 경우 나쁜 일은 없다고 생각합니다. 당신은 실패하고 예외가 발생합니다.

압축을 풀 때 오류가 발생하여 이미 파일 쓰기를 시작한 경우 파일이 손상됩니다. 그래서 그는 버퍼를 먼저 작성한 다음 감압이 완료되면 디스크에 버퍼를 작성하기로 결정했습니다. 상대적으로 작은 파일을 다루는 경우이 솔루션은 괜찮습니다. 그렇지 않으면 많은 메모리가 필요하며 OutOfMemeoryError를 생성 할 수 있습니다.

나는 임시 파일에 직접 압축을 풀고 임시 파일의 이름을 영구적 인 이름으로 바꿉니다. 마지막으로 블록은 임시 파일을 삭제해야합니다.

+0

좋은 생각. 실패한 글을 코드에서 처리하는 위치가없는 것처럼 보였으므로,이 특별한 경우에는 복사 붙여 넣기이거나 다른 시간에 작성된 것입니다. – Russell

관련 문제