4가지 자바 파일 복사 방식
1. FileStreams를 사용하여 복사
이것은 가장 고전적인 방식으로 한 파일의 내용을 다른 파일에 복사하는 것이다.FileInputStream을 사용하여 파일 A의 바이트를 읽고 FileOutputStream을 사용하여 파일 B에 기록합니다.이것은 첫 번째 방법의 코드입니다.
private static void copyFileUsingFileStreams(File source, File dest)
throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
}
보시다시피 우리는 몇 개의 읽기와 쓰기 작업try 데이터를 실행하기 때문에 이것은 비효율적이어야 합니다. 다음 방법은 새로운 방식을 보게 될 것입니다.2. FileChannel을 사용하여 복사
Java NIO는 transferFrom 방법을 포함하고 문서에 따라 파일 흐름보다 복사 속도가 빨라야 합니다.이것은 두 번째 방법의 코드입니다.
private static void copyFileUsingFileChannels(File source, File dest) throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}
3. Commons IO 복제 사용Apache Commons IO는 파일 복사 방법을 FileUtils 클래스에 제공하여 한 파일을 다른 곳으로 복사할 수 있습니다.Apache Commons FileUtils 클래스를 사용하기 편리할 때 이미 항목을 사용하고 있습니다.기본적으로 이 클래스는 Java NIO FileChannel 내부를 사용합니다.이것은 세 번째 방법의 코드입니다.
private static void copyFileUsingApacheCommonsIO(File source, File dest)
throws IOException {
FileUtils.copyFile(source, dest);
}
4. Java7의 Files 클래스를 사용하여 복사만약 자바 7에서 경험이 있다면, 복사 방법의 Files 클래스 파일을 사용해서 한 파일에서 다른 파일로 복사할 수 있다는 것을 알 수 있을 것이다.이것은 네 번째 방법의 코드입니다.
private static void copyFileUsingJava7Files(File source, File dest)
throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
5. 테스트이제 이 방법 중 어느 것이 더 효율적인지 알 수 있습니다. 우리는 하나의 큰 파일을 복제해서 하나의 간단한 프로그램을 사용할 것입니다.캐시에서 성능이 뚜렷하지 않도록 우리는 네 개의 다른 원본 파일과 네 개의 다른 목표 파일을 사용할 것이다.코드를 살펴보겠습니다.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import org.apache.commons.io.FileUtils;
public class CopyFilesExample {
public static void main(String[] args) throws InterruptedException,
IOException {
File source = new File("C:\\Users\
ikos7\\Desktop\\files\\sourcefile1.txt");
File dest = new File("C:\\Users\
ikos7\\Desktop\\files\\destfile1.txt");
// copy file using FileStreams
long start = System.nanoTime();
long end;
copyFileUsingFileStreams(source, dest);
System.out.println("Time taken by FileStreams Copy = "
+ (System.nanoTime() - start));
// copy files using java.nio.FileChannel
source = new File("C:\\Users\
ikos7\\Desktop\\files\\sourcefile2.txt");
dest = new File("C:\\Users\
ikos7\\Desktop\\files\\destfile2.txt");
start = System.nanoTime();
copyFileUsingFileChannels(source, dest);
end = System.nanoTime();
System.out.println("Time taken by FileChannels Copy = " + (end - start));
// copy file using Java 7 Files class
source = new File("C:\\Users\
ikos7\\Desktop\\files\\sourcefile3.txt");
dest = new File("C:\\Users\
ikos7\\Desktop\\files\\destfile3.txt");
start = System.nanoTime();
copyFileUsingJava7Files(source, dest);
end = System.nanoTime();
System.out.println("Time taken by Java7 Files Copy = " + (end - start));
// copy files using apache commons io
source = new File("C:\\Users\
ikos7\\Desktop\\files\\sourcefile4.txt");
dest = new File("C:\\Users\
ikos7\\Desktop\\files\\destfile4.txt");
start = System.nanoTime();
copyFileUsingApacheCommonsIO(source, dest);
end = System.nanoTime();
System.out.println("Time taken by Apache Commons IO Copy = "
+ (end - start));
}
private static void copyFileUsingFileStreams(File source, File dest)
throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
}
private static void copyFileUsingFileChannels(File source, File dest)
throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}
private static void copyFileUsingJava7Files(File source, File dest)
throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
private static void copyFileUsingApacheCommonsIO(File source, File dest)
throws IOException {
FileUtils.copyFile(source, dest);
}
}
출력:
Time taken by FileStreams Copy = 127572360
Time taken by FileChannels Copy = 10449963
Time taken by Java7 Files Copy = 10808333
Time taken by Apache Commons IO Copy = 17971677
보시다시피 FileChannels는 큰 파일을 복사하는 것이 가장 좋은 방법입니다.만약 네가 더 큰 파일을 처리한다면, 너는 더욱 큰 속도 차이를 알아차릴 것이다.이 예는 자바에서 파일을 복사할 수 있는 네 가지 다른 방법을 보여 주는 예입니다.이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.