상세 컨텐츠

본문 제목

file

IT 세상/자바세상

by 이현민 (지후지율아빠) 2009. 10. 6. 14:03

본문

안녕하세요, 수고많으십니다.
대용량 파일(작게는 수십 메가 바이트, 크게는 수백 메가 바이트)에서
특정부분, 20480바이트부터 30720바이트까지를
FileInputStream 을 이용하여 byte로 읽은 후
다시 FileOutputStream 을 이용하여
다른 한 개의 파일로 저장하려고 합니다.

read(byte[] b, int off, int len) 메서드가 있어서
이를 이용하였습니다.
다음은 코딩한 부분입니다...


=================================================================
<상단생략>

File originalFile = new File(dirPath + filename);

BufferedInputStream bis = new BufferedInputStream(new  FileInputStream(originalFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dirPath + filename2));

bufferedData = new byte[(int) originalFile.length()];

int readCount = 0;

if((readCount = bis.read(bufferedData)) != -1)
{
    bos.write(bufferedData, startOffset, readCount);
}

bos.close();
bis.close();

<하단생략>
=================================================================

그런데 약간의 문제점이 발생을 하는군요!

파일의 크기가 작을때는 별 문제가 없으나
크기가 커지면 메모리 문제가 발생을 합니다.


맘에 드는 로직은 아니지만 
위에서 bufferedData의 바이트배열 크기를
1024로 지정하고


while((readCount = bis.read(bufferedData)) != -1)
{
    //어쩌고저쩌고...ㅠ.ㅠ
}


와 같이 반복문을 통해서 readCount을 계속 더해나가다가
시작 위치인 startOffset에 도달하면
그 때부터 bos.write을 하면 되긴 하겠죠.

근데 좋은 방법은 아닌것 같다는 생각이 듭니다.

어떻게 하면 대용량 파일의 특정 부분을 바이트배열로 가져와서
다른 파일로 저장을 할 수 있을까요?



고수 여러분들의 조언을 기다리겠습니다.
  
2005-03-19 01:19:43.0  /  글번호 : 284128   
. pmj0708
오버플로우 문제라면
일단 크기가 작은 파일을 여럿만든뒤 합치는 식으로 하면 어떨지..
  
2005-03-19 23:00:06.0  /  글번호 : 284156   
ㅡㅡ+ ticano
InputStream에 보면 skip(long n)이라는 메서드가 있습니다.

그리고 buffer를 파일 사이즈만큼 잡는건 좋은 방법이 아닙니다.

일단 20480만큼 skip한 다음에


byte[] buffer = new byte[8192];
int read = -1;

int size = 0;
while (size < (30720 - 20480)) {
    if (read = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, read);
        size += read;
    } else {
        // 30702 까지 읽기도 전에 파일이 끝났다? 썅~~
    }
}
fos.flush(); // most important thing


반응형

관련글 더보기