nio FileChannel
와 normal FileInputStream/FileOuputStream
을 사용 하여 파일을 읽고 파일 시스템에 쓸 때 성능 (또는 장점)에 차이가 있는지 알아 내려고합니다 . 나는 내 컴퓨터에서 동일한 수준에서 수행하고 여러 번 FileChannel
속도가 느려지는 것을 관찰했습니다 . 이 두 가지 방법을 비교하는 자세한 내용을 알고 싶습니다. 내가 사용한 코드는 다음과 같습니다 350MB
. 테스트하는 파일은 다음과 같습니다 . 임의 액세스 또는 기타 고급 기능을보고 있지 않은 경우 파일 I / O에 NIO 기반 클래스를 사용하는 것이 좋은 옵션입니까?
package trialjavaprograms;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class JavaNIOTest {
public static void main(String[] args) throws Exception {
useNormalIO();
useFileChannel();
}
private static void useNormalIO() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
InputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
byte[] buf = new byte[64 * 1024];
int len = 0;
while((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
is.close();
long time2 = System.currentTimeMillis();
System.out.println("Time taken: "+(time2-time1)+" ms");
}
private static void useFileChannel() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
FileInputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
FileChannel f = is.getChannel();
FileChannel f2 = fos.getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(64 * 1024);
long len = 0;
while((len = f.read(buf)) != -1) {
buf.flip();
f2.write(buf);
buf.clear();
}
f2.close();
f.close();
long time2 = System.currentTimeMillis();
System.out.println("Time taken: "+(time2-time1)+" ms");
}
}
transferTo
/transferFrom
는 파일 복사에 더 일반적입니다. 한 번에 작은 덩어리를 읽고 머리가 너무 많은 시간을 소비하면 문제가 발생할 수 있지만 하드 드라이브를 더 빠르거나 느리게 만들지 않는 기술은 무엇입니까?