سؤال

هل هناك مكتبة جافا القياسية التي تتولى ملف العمليات المشتركة مثل نقل / نسخ الملفات / المجلدات؟

هل كانت مفيدة؟

المحلول

إليك كيفية القيام بذلك مع عمليات java.nio:

public static void copyFile(File sourceFile, File destFile) throws IOException {
    if(!destFile.exists()) {
        destFile.createNewFile();
    }

    FileChannel source = null;
    FileChannel destination = null;
    try {
        source = new FileInputStream(sourceFile).getChannel();
        destination = new FileOutputStream(destFile).getChannel();

        // previous code: destination.transferFrom(source, 0, source.size());
        // to avoid infinite loops, should be:
        long count = 0;
        long size = source.size();              
        while((count += destination.transferFrom(source, count, size-count))<size);
    }
    finally {
        if(source != null) {
            source.close();
        }
        if(destination != null) {
            destination.close();
        }
    }
}

نصائح أخرى

وليس بعد، ولكن NIO الجديد (JSR 203) سيكون الدعم لهذه العمليات المشتركة.

في غضون ذلك، هناك عدد قليل من الأشياء أن نأخذ في الاعتبار.

<وأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#renameTo(java.io.File)" يختلط = "noreferrer" > File.renameTo يعمل عموما فقط على نفس حجم نظام الملفات. وأعتقد أن هذا باعتباره معادلا لأمر "ام". استخدامه إذا كنت تستطيع، ولكن لنسخة العامة والدعم الخطوة، سوف تحتاج إلى أن يكون ارتداد.

ومتى لا تعمل على إعادة تسمية وسوف تحتاج إلى نسخ الملف (حذف الأصلي مع <لأ href = في الواقع "http://java.sun.com/j2se/1.5.0/docs/api/java/ الإعلام والتوعية / File.html # حذف () "يختلط =" noreferrer "> File.delete لو كان" خطوة "العملية). للقيام بذلك مع أكبر قدر من الكفاءة، استخدم في FileChannel.transferTo أو <وأ href =" http://java.sun.com/j2se/1.5.0/docs/api /java/nio/channels/FileChannel.html#transferFrom(java.nio.channels.ReadableByteChannel،٪20long،٪20long) "يختلط =" noreferrer "> طرق FileChannel.transferFrom . تنفيذ هو منهاج محدد، ولكن بشكل عام، عند نسخ من ملف واحد إلى آخر، تطبيقات تجنب نقل البيانات ذهابا وإيابا بين النواة والفضاء المستخدم، مما أسفر عن زيادة كبيرة في الكفاءة.

وراجع: http://commons.apache.org/io/

ولديها نسخة، وكما ذكرت JDK بالفعل التحرك.

ولا تطبيق طريقة نسخة الخاصة بك. هناك الكثير العائمة هناك ...

يبدو

والأجوبة السابقة ليكون عفا عليها الزمن.

وجاوة <لأ href = "http://docs.oracle.com/javase/7/docs/api/java/io/File.html#renameTo٪28java.io.File٪29" يختلط = "نوفولو noreferrer "> File.renameTo () وربما كان أسهل حل لAPI 7، ويبدو أن تعمل بشكل جيد. أن متأن أنه لا رمي الاستثناءات، ولكن يعود صح / خطأ!

لاحظ أن يبدو أن مشاكل معها في الإصدارات السابقة (نفس <لأ href = "http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html هناك # الخطوة٪ 28java.nio.file.Path،٪ 20java.nio.file.Path،٪ 20java.nio.file.CopyOption ...٪ 29 "يختلط =" نوفولو noreferrer "> NIO ).

إذا كنت بحاجة إلى استخدام الإصدار السابق، والتحقق من هنا .

Here's an example for API7:
        File f1= new File("C:\\Users\\.....\\foo");
        File f2= new File("C:\\Users\\......\\foo.old");
        System.err.println("Result of move:"+f1.renameTo(f2));

وبدلا من ذلك:

    System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI());
    Path b1=Files.move(f1.toPath(),  f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING ););
    System.err.println("Move: RETURNS:"+b1);

لقد مكتبة الجوافة جوجل أيضا التالية:

HTTP: // guava- libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html

وحاول استخدام <لأ href = "http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html" يختلط = "نوفولو" > org.apache.commons.io.FileUtils (ملف التلاعب العام المرافق). يتم توفير المرافق في الطرق التالية:

<اقتباس فقرة>   

(1) <وأ href = "http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html#moveDirectory٪28java.io .File،٪ 20java.io.File٪ 29 "يختلط =" نوفولو "> FileUtils.moveDirectory (srcDir ملف، destDir ملف) => ينقل ل   الدليل.

     

(2) <وأ href = "http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html#moveDirectoryToDirectory٪28java.io .File،٪ 20java.io.File،٪ 20boolean٪ 29 "يختلط =" نوفولو "> SRC FileUtils.moveDirectoryToDirectory (ملف، destDir ملف، منطقية   createDestDir) => ينقل دليل إلى دليل آخر.

     

(3) <وأ href = "http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html#moveFile٪28java.io .File،٪ 20java.io.File٪ 29 "يختلط =" نوفولو "> FileUtils.moveFile (srcFile ملف، destFile ملف) => ينقل ملف.

     

(4) <وأ href = "http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html#moveFileToDirectory٪28java.io .File،٪ 20java.io.File،٪ 20boolean٪ 29 "يختلط =" نوفولو "> srcFile FileUtils.moveFileToDirectory (ملف، destDir ملف، منطقية   createDestDir) => ينقل ملف إلى الدليل.

     

(5) <وأ href = "http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FileUtils.html#moveToDirectory٪28java.io .File،٪ 20java.io.File،٪ 20boolean٪ 29 "يختلط =" نوفولو "> SRC FileUtils.moveToDirectory (ملف، destDir ملف، منطقية   createDestDir) => ينقل ملف أو دليل إلى الوجهة   الدليل.

وانها بسيطة وسهلة وسريعة.

ملاحظة مثيرة للاهتمام: حاولت نسخ نفس الملف عبر الطبقات جافا مختلفة والوقت المطبوعة في نانو ثانية.

وتيار مدة باستخدام FileOutputStream بايت: 4 965 078

ومدة استخدام BufferedOutputStream: 1 237 206

ومدة استخدام (حرف قارئ النص: 2 858 875

ومدة استخدام BufferedReader (مخزنة تيار النص الحرف: 1 998 005

ومدة استخدام (الملفات NIO نسخة): 18 351 115

وعند استخدام الخيار نسخ الملفات بظاهرة استغرق ما يقرب من 18 مرات أطول !!! النينيو هي أبطأ الخيار لنسخ الملفات وBufferedOutputStream يبدو أسرع. لقد استخدمت نفس ملف نصي بسيط لكل فئة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top