Java 파일 복사 (간단 · 고속)FileChannel#transferTo
Java에서파일 복사하는 샘플 프로그램을 소개합니다.
샘플 프로그램은 J2SE1.4에서 도입 된 New I / O java.nio.channels.FileChannel#transferTo 메소드를 이용합니다.
데이터의 읽어들여에 필요한 버퍼를 의식하는 일 없이, 카피 처리의 프로그램을 기술할 수 있어 가장 심플한 코딩이 됩니다.
채널이란?
채널이라는 단어는 다양한 의미로 사용되고 있지만,
기본적으로는 다른 디바이스와의 사이에서 데이터의 입출력을 실시하기 위한 전송로를 나타내는 것 같습니다.java.nio.channels.FileChannel 는 파일에의 읽어들여, 기입을 실시하기 위한 접속을 나타내는 클래스가 됩니다.
transferTo 메소드는, 카피원이 되는 파일로부터, 카피처의 채널에 바이트 데이터를 전송할 수가 있습니다.
이하, JavaAPI 문서로부터 인용.
transferTo(long position, long count, WritableByteChannel target)
이 채널의 파일로부터 지정된 기입 가능한 바이트 채널에 바이트를 전송 합니다.
이 채널로부터 데이터를 읽어들여 타겟 채널에 기입한다고 하는 단순한 루프보다, 이 메소드 쪽이 훨씬 효율적으로 처리할 수 있을 가능성이 있습니다. 많은 운영 체제는 파일 시스템 캐시에서 대상 채널로 바이트를 직접 전송할 수 있습니다. 이 때, 바이트의 카피는 행해지지 않습니다.
이번 검증 결과에서는, 통상의 스트림을 이용하는 방법이나,
FileChannel 의 다른 방법 ( ByteBuffer#allocateDirect 메서드를 사용하는 방법 등)보다 고속으로 카피 처리를 실시할 수 있었습니다.
샘플 프로그램
FileChannel srcChannel = new
FileInputStream(srcPath).getChannel();
FileChannel destChannel = new
FileOutputStream(destPath).getChannel();
try {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} finally {
srcChannel.close();
destChannel.close();
}
}
실행
샘플 프로그램의 파일 카피를 실시하기 위해서, C드라이브 바로 아래에 100MB의 파일 「100M.txt」를 준비했습니다.
샘플 프로그램에서는 C:\100M.txt 복사 C:\a.txt 파일을 만듭니다.
또한, 샘플의 실행은 이하의 환경에서 실시했습니다.
OS : WindowsXP
CPU : Athlon 1.46GHz
메모리 : 1GB
JRE : 1.6.4
◆실행예
/** * 예제 실행 * @param args */ public static void main(String[] args) { try { copyTransfer("C:\\100M.txt", "C:\\a.txt"); } catch (IOException e) { e.printStackTrace(); } }
FileChannel#transferTo 메소드를 이용한 복사 처리에서는
100MB 파일 복사가 3초 정도 완료되었습니다. 또한 복사 처리 중의 힙 사용량에 대해서도 300 (KB) 정도였습니다.
참고로,Java 파일 복사(버퍼 크기 변경)에서 소개하는 방법으로,
가장 효율적인 1000KB 버퍼 크기를 지정한 경우 처리 시간은 4초 정도, 힙 사용량은 1,300KB 정도였습니다.
스트림에 의한 파일 카피에서도, 버퍼 사이즈를 튜닝하는 것으로 고속화되기 때문에,
하나의 파일을 복사하는 과정에서는 그다지 차이가 없다고 할 수 있습니다.
그러나, 큰 파일을 연속적으로 카피하는 경우나, 복수의 카피 처리를 평행해 실행하는 경우에서는, 처리 속도·힙 사용량의 관점에서 FileChannel 는 효과를 발휘할 수 있을 것입니다.