4가지 자바 파일 복사 방식

6818 단어 java복사
Java는 파일을 처리할 수 있는 입출력 작업 클래스를 제공하지만 파일을 복사하는 방법은 없습니다.파일을 복사하는 것은 프로그램이 많은 파일과 관련된 것을 처리해야 할 때 중요한 작업이다.그러나 자바 파일 복사 작업을 할 수 있는 몇 가지 방법은 다음과 같다.
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는 큰 파일을 복사하는 것이 가장 좋은 방법입니다.만약 네가 더 큰 파일을 처리한다면, 너는 더욱 큰 속도 차이를 알아차릴 것이다.이 예는 자바에서 파일을 복사할 수 있는 네 가지 다른 방법을 보여 주는 예입니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기