본문 바로가기

Language/Java / JSP

[Java] 파일 복사하기 - FileChannel

반응형

어느날 업무를 보던중에 운영중인 서버에서 특정 컨텐츠에 대한 물리적 파일(사진, 영상 등등)을 한꺼번에 이관해야 할 일이 있었다.
전체 컨텐츠의 사이즈가 꽤 컸기때문에 어떻게 할까 하다가, DB에서 백업해야할 특정 컨텐츠들의 정보를 쿼리로 뽑아낸 후
해당 컨텐츠의 파일들을 한쪽으로 복사한뒤 FTP로 내려받기로 결정하였다.

그래서 간단하게 파일 복사할 클래스를 만들었고, 파일 복사방법은 아무 생각없이 아래와 같이 작성하였다.

	FileInputStream fis = new FileInputStream(원본파일);
	FileOutputStream fos = new FileOutputStream(복사파일);
	
	int data = 0;
	while((data=fis.read())!=-1) {
		fos.write(data);
	}
	
	fis.close();
	fos.close();



전체 복사해야 할 파일은 4만건 정도에 20GB에 육박했다. 프로그램을 돌려보니 파일 복사 속도가 느리다.
개별 복사 속도는 빨랐으나 파일 건수가 많다보니 전체적인 퍼포먼스가 떨어졌다.

고심끝에 구글링을 통해 FileChannel을 이용하면 더 빠른 복사가 가능하다는 사실을 알았다.
그래서 코드를 다음과 같이 바꿨다.

	FileInputStream inputStream = new FileInputStream(원본파일);         
	FileOutputStream outputStream = new FileOutputStream(복사파일);
	 
	FileChannel fcin =  inputStream.getChannel();
	FileChannel fcout = outputStream.getChannel();
	 
	long size = fcin.size();
	fcin.transferTo(0, size, fcout);
	 
	fcout.close();
	fcin.close();
	 
	outputStream.close();
	inputStream.close();




코드를 변경하였더니 복사 속도는 2배이상 빨라졌다.

정확한 시간을 측정하지는 않았지만 파일 복사되는 로그가 올라가는것을 보면 2배는 더 빨라진게 확실했다.


흠. 이 녀석에 대해서는 공부가 좀 필요할듯 .