Untuk menyalin file dan menyimpannya ke jalur tujuan Anda, Anda dapat menggunakan metode di bawah ini.
publicstaticvoid copy(File src,File dst)throwsIOException{InputStream in =newFileInputStream(src);try{OutputStream out =newFileOutputStream(dst);try{// Transfer bytes from in to outbyte[] buf =newbyte[1024];int len;while((len = in.read(buf))>0){
out.write(buf,0, len);}}finally{
out.close();}}finally{
in.close();}}
Pada API 19+ Anda dapat menggunakan Java Automatic Resource Management:
publicstaticvoid copy(File src,File dst)throwsIOException{try(InputStream in =newFileInputStream(src)){try(OutputStream out =newFileOutputStream(dst)){// Transfer bytes from in to outbyte[] buf =newbyte[1024];int len;while((len = in.read(buf))>0){
out.write(buf,0, len);}}}}
Terima kasih. setelah membenturkan kepalaku, saya menemukan masalah adalah tidak adanya izin untuk menulis ke penyimpanan eksternal. sekarang berfungsi dengan baik.
AS
8
@ mohitum007 jika file gagal disalin maka pengecualian dilemparkan. gunakan try catch block saat memanggil metode.
Nima G
9
Jika pengecualian dilemparkan, sungai tidak akan ditutup sampai mereka mengumpulkan sampah, dan itu tidak baik . Pertimbangkan untuk menutupnya finally.
Pang
1
@Pang. Kamu benar. Yang lebih buruk, in / out.close () harus dipanggil atau jika tidak akan ada kebocoran sumber daya di OS yang mendasarinya, karena GC tidak akan pernah menutup deskriptor file yang terbuka. GC tidak dapat menutup sumber daya OS di luar JVM seperti deskriptor file atau soket. Itu harus selalu ditutup pada klausa akhirnya secara terprogram atau menggunakan sintaks baru coba-dengan-sumber daya: docs.oracle.com/javase/tutorial/essential/exceptions/…
earizon
4
Tolong, tutup kedua Streaming di dalam akhirnya, jika ada Excepcion, memori stream Anda tidak akan dikumpulkan.
transferTo dapat melempar pengecualian dan dalam hal ini Anda membiarkan aliran terbuka. Sama seperti Pang dan Nima berkomentar dalam jawaban yang diterima.
Viktor Brešan
Juga, transferTo harus dipanggil di dalam loop karena tidak menjamin bahwa itu akan mentransfer jumlah total yang diminta.
Viktor Brešan
Saya mencoba solusi Anda dan gagal bagi saya dengan pengecualian java.io.FileNotFoundException: /sdcard/AppProj/IMG_20150626_214946.jpg: open failed: ENOENT (No such file or directory)di FileOutputStream outStream = new FileOutputStream(dst);langkah. Menurut teks yang saya sadari, bahwa file itu tidak ada, jadi saya memeriksanya dan menelepon dst.mkdir();jika perlu, tetapi masih tidak membantu. Saya juga mencoba memeriksa dst.canWrite();dan mengembalikannya false. Bisakah ini sumber masalahnya? Dan ya, sudah <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>.
Mike B.
1
@ ViktorBrešan Setelah API 19 Anda dapat menggunakan manajemen sumber daya otomatis Java dengan mendefinisikan aliran masuk dan keluar dalam pembukaan percobaan Andatry ( FileInputStream inStream = new FileInputStream(src); FileOutputStream outStream = new FileOutputStream(dst) ) {
AlbertMarkovski
Apakah ada cara untuk membuat solusi ini mempublikasikan kemajuannya onProgressUpdate, sehingga saya bisa menunjukkannya di ProgressBar? Dalam solusi yang diterima saya dapat menghitung kemajuan dalam loop sementara, tetapi saya tidak bisa melihat bagaimana melakukannya di sini.
Ini adalah jawaban yang paling ringkas namun fleksibel. Jawaban yang lebih sederhana gagal menjelaskan URI yang dibuka melalui contentResolver.openInputStream(uri).
Tidak sesederhana itu jika File Anda berasal dari Galeri maksud Uri.
AjahnCharles
Baca komentar di bawah jawaban itu: "Jawaban ini berbahaya dan tidak layak mendapat suara. Itu gagal jika Uri adalah konten: // atau Uri non-file lainnya." (Saya benar-benar memilih - saya hanya ingin mengklarifikasi bahwa itu bukan peluru perak)
AjahnCharles
5
Berikut ini adalah solusi yang benar-benar menutup aliran input / output jika terjadi kesalahan saat menyalin. Solusi ini menggunakan metode apache Commons IO IOUtils untuk menyalin dan menangani penutupan aliran.
publicvoid copyFile(File src,File dst){InputStream in =null;OutputStream out =null;try{
in =newFileInputStream(src);
out =newFileOutputStream(dst);IOUtils.copy(in, out);}catch(IOException ioe){Log.e(LOGTAG,"IOException occurred.", ioe);}finally{IOUtils.closeQuietly(out);IOUtils.closeQuietly(in);}}
Jawaban:
Untuk menyalin file dan menyimpannya ke jalur tujuan Anda, Anda dapat menggunakan metode di bawah ini.
Pada API 19+ Anda dapat menggunakan Java Automatic Resource Management:
sumber
finally
.Atau, Anda dapat menggunakan FileChannel untuk menyalin file. Ini mungkin lebih cepat daripada metode copy byte saat menyalin file besar. Anda tidak dapat menggunakannya jika file Anda lebih besar dari 2GB.
sumber
java.io.FileNotFoundException: /sdcard/AppProj/IMG_20150626_214946.jpg: open failed: ENOENT (No such file or directory)
diFileOutputStream outStream = new FileOutputStream(dst);
langkah. Menurut teks yang saya sadari, bahwa file itu tidak ada, jadi saya memeriksanya dan menelepondst.mkdir();
jika perlu, tetapi masih tidak membantu. Saya juga mencoba memeriksadst.canWrite();
dan mengembalikannyafalse
. Bisakah ini sumber masalahnya? Dan ya, sudah<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
.try ( FileInputStream inStream = new FileInputStream(src); FileOutputStream outStream = new FileOutputStream(dst) ) {
onProgressUpdate
, sehingga saya bisa menunjukkannya di ProgressBar? Dalam solusi yang diterima saya dapat menghitung kemajuan dalam loop sementara, tetapi saya tidak bisa melihat bagaimana melakukannya di sini.Ekstensi Kotlin untuk itu
sumber
contentResolver.openInputStream(uri)
.Ini bekerja baik untuk saya
sumber
Ini sederhana di Android O (API 26), Seperti yang Anda lihat:
sumber
Mungkin sudah terlambat untuk jawaban tetapi cara yang paling nyaman adalah menggunakan
FileUtils
inistatic void copyFile(File srcFile, File destFile)
misalnya ini yang saya lakukan
`
`
sumber
Lebih sederhana sekarang dengan Kotlin:
true
ataufalse
untuk menimpa file tujuanhttps://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/copy-to.html
sumber
Berikut ini adalah solusi yang benar-benar menutup aliran input / output jika terjadi kesalahan saat menyalin. Solusi ini menggunakan metode apache Commons IO IOUtils untuk menyalin dan menangani penutupan aliran.
sumber
di kota, hanya:
sumber