Itu selalu mengganggu saya bahwa satu-satunya cara untuk menyalin file di Jawa melibatkan membuka stream, mendeklarasikan buffer, membaca dalam satu file, mengulanginya, dan menuliskannya ke steam lain. Web penuh dengan implementasi yang serupa, namun masih sedikit berbeda dari solusi jenis ini.
Apakah ada cara yang lebih baik yang tetap dalam batas-batas bahasa Jawa (artinya tidak melibatkan mengeksekusi perintah spesifik OS)? Mungkin dalam beberapa paket utilitas open source yang dapat diandalkan, yang setidaknya akan mengaburkan implementasi mendasar ini dan memberikan solusi satu baris?
Jawaban:
Seperti yang disebutkan oleh toolkit di atas, Apache Commons IO adalah caranya, khususnya FileUtils . copyFile () ; itu menangani semua angkat berat untuk Anda.
Dan sebagai catatan tambahan, perhatikan bahwa versi terbaru FileUtils (seperti rilis 2.0.1) telah menambahkan penggunaan NIO untuk menyalin file; NIO dapat secara signifikan meningkatkan kinerja penyalinan file , sebagian besar karena rutinitas NIO menunda menyalin langsung ke OS / sistem file daripada menanganinya dengan membaca dan menulis byte melalui layer Java. Jadi, jika Anda mencari kinerja, mungkin ada baiknya Anda memeriksa apakah Anda menggunakan versi terbaru FileUtils.
sumber
Saya akan menghindari penggunaan mega api seperti apache commons. Ini adalah operasi sederhana dan dibangun ke dalam JDK dalam paket NIO baru. Itu semacam sudah ditautkan dalam jawaban sebelumnya, tetapi metode kunci dalam api NIO adalah fungsi baru "transferTo" dan "transferFrom".
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)
Salah satu artikel tertaut menunjukkan cara yang hebat tentang bagaimana mengintegrasikan fungsi ini ke dalam kode Anda, menggunakan transferFrom:
Mempelajari NIO bisa sedikit rumit, jadi Anda mungkin ingin mempercayai mekanik ini sebelum berangkat dan mencoba belajar NIO dalam semalam. Dari pengalaman pribadi itu bisa menjadi hal yang sangat sulit untuk dipelajari jika Anda tidak memiliki pengalaman dan diperkenalkan ke IO melalui aliran java.io.
sumber
Sekarang dengan Java 7, Anda dapat menggunakan sintaks coba sumber daya berikut:
Atau, lebih baik lagi, ini juga dapat dicapai dengan menggunakan kelas File baru yang diperkenalkan di Java 7:
Cukup manis, eh?
sumber
Kelas utilitas
Menyalin direktori atau file
Memindahkan direktori atau file
Menyalin direktori atau file secara rekursif
sumber
Di Java 7 itu mudah ...
sumber
Untuk menyalin file dan menyimpannya ke jalur tujuan Anda, Anda dapat menggunakan metode di bawah ini.
sumber
Perhatikan bahwa semua mekanisme ini hanya menyalin konten file, bukan metadata seperti izin. Jadi jika Anda menyalin atau memindahkan file .sh yang dapat dieksekusi di linux file baru tidak akan dapat dieksekusi.
Untuk benar-benar menyalin atau memindahkan file, yaitu untuk mendapatkan hasil yang sama dengan menyalin dari baris perintah, Anda benar-benar perlu menggunakan alat asli. Entah skrip shell atau JNI.
Rupanya, ini mungkin diperbaiki di java 7 - http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html . Semoga saja!
sumber
Pustaka Guava Google juga memiliki metode salin :
Peringatan: Jika
to
mewakili file yang ada, file itu akan ditimpa dengan kontenfrom
. Jikato
danfrom
merujuk ke file yang sama , konten file itu akan dihapus.Parameter:
from
- file sumberto
- file tujuanMelempar:
IOException
- jika terjadi kesalahan I / OIllegalArgumentException
- jikafrom.equals(to)
sumber
Tersedia sebagai standar di Java 7, path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ tutorial / esensial / io / copy.html
Saya tidak percaya butuh waktu lama bagi mereka untuk membakukan sesuatu yang sangat umum dan sederhana seperti menyalin file :(
sumber
Tiga kemungkinan masalah dengan kode di atas:
Inilah mengapa
org.apache.tools.ant.util.ResourceUtils.copyResource
sangat rumit. Perhatikan juga bahwa saat transferFrom tidak masalah, transferTo rusak pada JDK 1.4 di Linux (lihat Bug ID: 5056395 ) - Jesse Glick Jansumber
Jika Anda berada di aplikasi web yang sudah menggunakan Spring dan jika Anda tidak ingin menyertakan Apache Commons IO untuk menyalin file sederhana, Anda dapat menggunakan FileCopyUtils dari kerangka Spring.
sumber
Berikut adalah tiga cara Anda dapat dengan mudah menyalin file dengan satu baris kode!
Java7 :
java.nio.file.Files # copy
Appache Commons IO :
FileUtils # copyFile
Jambu biji :
File # copy
sumber
Files.copy
hanya menggunakan 2 parameter adalah untukPath
untukStream
. Cukup tambahkan parameterStandardCopyOption.COPY_ATTRIBUTES
atauStandardCopyOption.REPLACE_EXISTING
untukPath
kePath
sumber
Salinan NIO dengan buffer adalah yang tercepat menurut pengujian saya. Lihat kode kerja di bawah ini dari proyek uji saya di https://github.com/mhisoft/fastcopy
}
sumber
Cepat dan bekerja dengan semua versi Java dan juga Android:
sumber
Sedikit terlambat ke pesta, tetapi di sini adalah perbandingan waktu yang dibutuhkan untuk menyalin file menggunakan berbagai metode menyalin file. Saya memutar melalui metode untuk 10 kali dan mengambil rata-rata. Transfer file menggunakan aliran IO tampaknya menjadi kandidat terburuk:
Berikut adalah metodenya:
Satu-satunya kelemahan yang dapat saya lihat saat menggunakan kelas saluran NIO adalah bahwa saya masih belum bisa menemukan cara untuk menunjukkan kemajuan penyalinan file menengah.
sumber