يمكن استخدام نسخ الملفات باستخدام Java في كل مكان. هنا فصل للرجوع إليه. هناك طريقتان في المجموع:
copyfile الثابتة العامة (سلسلة srcfilename ، سلسلة destfilename ، تراكب منطقي) ؛ public static boolean copydirctory (سلسلة srcdirname ، سلسلة destdirname ، تراكب منطقي) ؛
في:
اسم ملف SRCFiLename ليتم نسخه
اسم ملف الهدف من descfilename
تراكب في حالة وجود الملف المستهدف ، سواء كان للكتابة فوقه. إذا كانت النسخة ناجحة ، فأرجع صحيحًا ، وإلا مرة أخرى خاطئة
شفرة:
استيراد java.io.file ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.filenotfoundException ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputStream ؛ استيراد javax.swing.joptionpane ؛ / ** * نسخ الملف أو المجلد * * ZWW */ الفئة العامة copyFileUtil {message private Static String = "" ؛ / **. = ملف جديد (srcfilename) ؛ // حدد ما إذا كان الملف المصدر موجودًا إذا (! srcfile.exists ()) {message = "ملف المصدر:" + srcfilename + "غير موجود!" ؛ joptionpane.showmessagedialog (null ، message) ؛ العودة كاذبة } if if (! srcfile.isfile ()) {message = "فشل الملف ، الملف المصدر:" + srcfilename + "ليس ملفًا!" ؛ joptionpane.showmessagedialog (null ، message) ؛ العودة كاذبة } // تحديد ما إذا كان الملف الهدف موجودًا ملف destfile = ملف جديد (destFiLename) ؛ if (destfile.exists ()) {// إذا كان الملف الهدف موجودًا ويسمح بالكتابة فوق (تراكب) {// حذف الملف الهدف الحالي ، بغض النظر عما إذا كان الملف الهدف هو دليل أو ملف واحد جديد (destFilename) .delete () ؛ }} آخر {// إذا كان الدليل الذي لم يكن فيه الملف الهدف موجودًا ، قم بإنشاء الدليل إذا (! destfile.getParentFile (). }}} // copy file int byteread = 0 ؛ // عدد البايتات قراءة inputStream في = null ؛ OutputStream Out = null ؛ حاول {in = new FileInputStream (srcfile) ؛ out = fileOutputStream جديد (destfile) ؛ Byte [] Buffer = New Byte [1024] ؛ بينما ((byteread = in.read (buffer))! = -1) {out.write (buffer ، 0 ، byteread) ؛ } إعادة صواب ؛ } catch (fileNotfoundException e) {return false ؛ } catch (ioException e) {return false ؛ } أخيرًا {try {if (out! = null) out.close () ؛ if (في! = null) in.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} ستر DestDirName ، Opplay Boolean) {// تحديد ما إذا كان دليل المصدر موجودًا ملف srcdir = ملف جديد (srcdirname) ؛ if (! srcdir.exists ()) {message = "فشل الدليل: دليل المصدر" + srcdirname + "لا توجد!" ؛ joptionpane.showmessagedialog (null ، message) ؛ العودة كاذبة } آخر if (! srcdir.isdirectory ()) {message = "فشل الدليل:" + srcdirname + "ليس دليلًا!" ؛ joptionpane.showmessagedialog (null ، message) ؛ العودة كاذبة } // إذا لم ينتهي اسم الدليل المستهدف بملف محدد ، فأضف محدد الملف إذا (! destDirName.endswith (file.separator)) {destDirName = destDirname + file.separator ؛ } ملف destdir = ملف جديد (destDirName) ؛ // إذا كان المجلد الهدف موجودًا إذا كان (destdir.exists ()) {// إذا تم السماح بالتراكب ، فقم بحذف الدليل الهدف الحالي if (overlay) {file new (destdirname) .delete () ؛ } else {message = "فشل دليل الدليل: دليل الوجهة" + destdirname + "موجود بالفعل!" ؛ joptionpane.showmessagedialog (null ، message) ؛ العودة كاذبة }} آخر {// إنشاء نظام الدليل الوجهة. if (! destdir.mkdir ()) {system.out.println ("فشل دليل النسخ: فشل إنشاء دليل الوجهة!") ؛ العودة كاذبة }} علم منطقي = صحيح ؛ file [] files = srcdir.listfiles () ؛ لـ (int i = 0 ؛ i <files.length ؛ i ++) {// copy file if (files [i] .isfile ()) {flag = copyfileutil.copyfile (files [i] إذا (! العلم) كسر. } آخر إذا (الملفات [i] .isdirectory ()) {flag = copyFileUtil.CopyDirectory (ملفات [i] .getabsolutepath () ، destdirname + files [i] .getName () ، overlay) ؛ إذا (! العلم) كسر. }} if (! flag) {message = "copy directory" + srcdirname + "to" + destdirname + "fans!" ؛ joptionpane.showmessagedialog (null ، message) ؛ العودة كاذبة } آخر {return true ؛ }} public static void main (string [] args) {String srcdirname = "c:/test/test0/test1" ؛ سلسلة destdirname = "C:/ttt" ؛ copyfileutil.copydirctory (srcdirname ، destdirname ، true) ؛ }}دون النظر في التحسين متعدد الخيوط ، فإن أسرع طريقة لنسخ الملفات ذات الخيوط الواحدة هي (كلما كانت الملف أكبر ، كلما زادت الميزة ، يكون ذلك بشكل عام 30+٪ أسرع من الأساليب الشائعة الاستخدام):
private static void niotransfercopy (مصدر الملف ، هدف الملف) {filechannel في = null ؛ filechannel out = null ؛ FileInputStream Instream = null ؛ FileOutputStream OutStream = null ؛ حاول {instream = new FileInputStream (Source) ؛ OutStream = جديد fileOutputStream (Target) ؛ في = instream.getChannel () ؛ out = overstream.getChannel () ؛ in.transferto (0 ، in.size () ، out) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {close (instream) ؛ إغلاق (في) ؛ إغلاق (خارج) ؛ أغلق (خارج) ؛ }}إذا كنت بحاجة إلى مراقبة تقدم النسخ المتماثل ، فيمكنك استخدام ثاني أسرع طريقة (انتبه إلى حجم المخزن المؤقت ، الذي له تأثير كبير على السرعة):
private static void niobuffercopy (مصدر الملف ، هدف الملف) {filechannel في = null ؛ filechannel out = null ؛ FileInputStream Instream = null ؛ FileOutputStream OutStream = null ؛ حاول {instream = new FileInputStream (Source) ؛ OutStream = جديد fileOutputStream (Target) ؛ في = instream.getChannel () ؛ out = overstream.getChannel () ؛ Bytebuffer Buffer = bytebuffer.allocate (4096) ؛ بينما (in.read (buffer)! = -1) {buffer.flip () ؛ out.write (المخزن المؤقت) ؛ buffer.clear () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {close (instream) ؛ إغلاق (في) ؛ إغلاق (خارج) ؛ أغلق (خارج) ؛ }}الطريقة الشائعة الاستخدام 1 هي:
private static void customBufferBufferedStreamCopy (مصدر الملف ، هدف الملف) {inputStream fis = null ؛ OutputStream FOS = NULL ؛ حاول {fis = جديد bufferedInputStream (جديد fileInputStream (المصدر)) ؛ fos = جديد bufferedoutputstream (fileOutputStream (الهدف) الجديد) ؛ Byte [] buf = new byte [4096] ؛ int أنا ؛ بينما ((i = fis.read (buf))! = -1) {fos.write (buf ، 0 ، i) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {close (fis) ؛ إغلاق (FOS) ؛ }}الطريقة الشائعة الاستخدام 2 هي:
private static void customBufferStreamCopy (مصدر الملف ، هدف الملف) {inputStream fis = null ؛ OutputStream FOS = NULL ؛ حاول {fis = new FileInputStream (Source) ؛ fos = fileOutputStream (الهدف) ؛ Byte [] buf = new byte [4096] ؛ int أنا ؛ بينما ((i = fis.read (buf))! = -1) {fos.write (buf ، 0 ، i) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {close (fis) ؛ إغلاق (FOS) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.