העתקת קובץ Java – 4 דרכים להעתיק קובץ ב-Java

העתקת קובץ ב-Java היא פעולה נפוצה מאוד. אך למחלקת java.io.File אין שום שיטה קצרה להעתקת קובץ ממקור ליעד. כאן נלמד על ארבעה אמצעים שונים לביצוע העתקת קובץ ב-Java.

העתקת קובץ ב-Java

  1. העתקת קובץ ב-Java – נזר

זו הדרך המסורתית להעתקת קובץ ב-Java. כאן אנו יוצרים שני קבצים – מקור ויעד. לאחר מכן, אנו יוצרים InputStream מהמקור וכותבים אותו לקובץ היעד באמצעות OutputStream לפעולת העתקת קובץ ב-Java. הנה השיטה שניתן להשתמש בה להעתקת קובץ באמצעות נזרים ב-Java.

private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
}
  1. העתקת קובץ ב-Java – java.nio.channels.FileChannel

מחלקות NIO של Java הוזנו בגרסה 1.4 ו-FileChannel יכול לשמש להעתקת קובץ ב-Java. לפי תיעוד השיטה transferFrom(), יש דרך זו להעתקת קובץ אמורה להיות מהירה יותר משימוש בנזרים להעתקת קבצים ב-Java. הנה השיטה שניתן להשתמש בה להעתקת קובץ באמצעות FileChannel ב-Java.

private static void copyFileUsingChannel(File source, File dest) throws IOException {
    FileChannel sourceChannel = null;
    FileChannel destChannel = null;
    try {
        sourceChannel = new FileInputStream(source).getChannel();
        destChannel = new FileOutputStream(dest).getChannel();
        destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
       }finally{
           sourceChannel.close();
           destChannel.close();
   }
}
  1. העתקת קובץ ב-Java – Apache Commons IO FileUtils

אפאצ'ה קומונס IO FileUtils.copyFile(File srcFile, File destFile) ניתן לשימוש להעתקת קובץ ב-Java. אם כבר משתמשים ב-Apache Commons IO בפרויקט שלך, יש משמעות להשתמש בזה עבור פשטות בקוד. באופן פנימי הוא משתמש ב-Java NIO FileChannel, כך שניתן להימנע מהשימוש בשיטת העטיפה הזו אם אינך משתמש בה כבר עבור פונקציות אחרות. הנה השיטה לשימוש באפאצ'ה קומונס IO עבור העתקת קובץ ב-Java.

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}
  1. העתקת קובץ Java – מחלקת Files

אם אתה עובד על Java 7 או גרסה גבוהה יותר, ניתן להשתמש במחלקת Files ובשיטת copy() על מנת להעתיק קובץ ב-Java. זה משתמש בספקי מערכת הקבצים להעתקת הקבצים.

private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

עכשיו כדי לגלות איזו השיטה המהירה ביותר, כתבתי מחלקת בדיקה וביצעתי את השיטות לעיל אחת אחת עבור העתקת קובץ של 1 GB. בכל קריאה, השתמשתי בקבצים שונים כדי למנוע כל תועלת לשיטות מאוחרות יותר בגלל מטמון.

package com.journaldev.files;

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 JavaCopyFile {

    public static void main(String[] args) throws InterruptedException, IOException {
        File source = new File("/Users/pankaj/tmp/source.avi");
        File dest = new File("/Users/pankaj/tmp/dest.avi");

        //העתקת קובץ בדרך מסורתית באמצעות Stream
        long start = System.nanoTime();
        copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
        
        //העתקת קבצים באמצעות java.nio FileChannel
        source = new File("/Users/pankaj/tmp/sourceChannel.avi");
        dest = new File("/Users/pankaj/tmp/destChannel.avi");
        start = System.nanoTime();
        copyFileUsingChannel(source, dest);
        System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
        
        //העתקת קבצים באמצעות apache commons io
        source = new File("/Users/pankaj/tmp/sourceApache.avi");
        dest = new File("/Users/pankaj/tmp/destApache.avi");
        start = System.nanoTime();
        copyFileUsingApacheCommonsIO(source, dest);
        System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
        
        //שימוש במחלקת Files של Java 7
        source = new File("/Users/pankaj/tmp/sourceJava7.avi");
        dest = new File("/Users/pankaj/tmp/destJava7.avi");
        start = System.nanoTime();
        copyFileUsingJava7Files(source, dest);
        System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));        
    }
}

הנה פלט התוכנית לעיל, שים לב שהערכתי את הקוד למעלה כדי לוודא שבכל פעם משתמשים רק בשיטה אחת עבור העתקת קובץ ב-Java.

Time taken by Stream Copy = 44582575000
Time taken by Channel Copy = 104138195000
Time taken by Apache Commons IO Copy = 108396714000
Time taken by Java7 Files Copy = 89061578000

מה הניתוב הכי טוב להעתקת קובץ ב-Java. אבל זה מבחן מאוד בסיסי. אם אתה עובד על פרויקט התקפי ביצועים, עליך לנסות שיטות שונות להעתקת קובץ ב-Java ולרשום את הזמנים כדי לגלות את הגישה הטובה ביותר לפרויקט שלך. עליך גם לשחק סביב עם שיטות שונות של העתקת קבצי Java בהתבסס על גודל הממוצע של הקובץ. יצרתי סרטון ב-YouTube עבור 4 דרכים להעתקת קובץ ב-Java, תוכל לצפות בו כדי ללמוד עוד. https://www.youtube.com/watch?v=op6tgG95zek

Source:
https://www.digitalocean.com/community/tutorials/java-copy-file