Saya memiliki proses Java yang membuka file menggunakan FileReader. Bagaimana cara mencegah proses lain (Java) membuka file ini, atau setidaknya memberi tahu proses kedua bahwa file sudah dibuka? Apakah ini secara otomatis membuat proses kedua mendapatkan pengecualian jika file terbuka (yang memecahkan masalah saya) atau apakah saya harus membukanya secara eksplisit dalam proses pertama dengan semacam bendera atau argumen?
Untuk memperjelas:
Saya memiliki aplikasi Java yang mencantumkan folder dan membuka setiap file dalam daftar untuk memprosesnya. Ini memproses setiap file setelah yang lain. Pemrosesan setiap file terdiri dari membacanya dan melakukan beberapa perhitungan berdasarkan isinya dan memakan waktu sekitar 2 menit. Saya juga memiliki aplikasi Java lain yang melakukan hal yang sama tetapi menulis di file. Yang saya inginkan adalah dapat menjalankan aplikasi ini pada saat yang sama sehingga skenarionya berjalan seperti ini. ReadApp mencantumkan folder dan menemukan file A, B, C. Ini membuka file A dan mulai membaca. WriteApp mencantumkan folder dan menemukan file A, B, C. Ini membuka file A, melihat itu terbuka (dengan pengecualian atau cara apa pun) dan pergi ke file B. ReadApp menyelesaikan file A dan melanjutkan ke B. Ia melihat bahwa itu terbuka dan terus ke C. Sangat penting bahwa WriteApp tidak t menulis saat ReadApp membaca file yang sama atau sebaliknya. Mereka adalah proses yang berbeda.
Jawaban:
FileChannel.lock mungkin yang Anda inginkan.
(Penafian: Kode tidak dikompilasi dan tentu saja tidak diuji.)
Perhatikan bagian berjudul "ketergantungan platform" di dokumen API untuk FileLock .
sumber
FileOutputStream
).FileOutputStream
tidak akan banyak berguna untuk aReader
.NonWritableChannelException
, karenalock()
mencoba mendapatkan kunci eksklusif, tetapi itu memerlukan akses tulis. Jika Anda memiliki aliran input , Anda dapat menggunakannyalock(0L, Long.MAX_VALUE, false)
yang memperoleh kunci bersama dan hanya memerlukan akses baca. Anda juga dapat menggunakanRandomAccessFile
buka dalam mode baca-tulis jika Anda menginginkan kunci eksklusif saat membaca ... tetapi itu akan melarang pembaca secara bersamaan.lock(0L, Long.MAX_VALUE, true)
, tidaklock(0L, Long.MAX_VALUE, false)
. argumen terakhir adaboolean shared
docs.oracle.com/javase/8/docs/api/java/nio/channels/…Jangan gunakan kelas dalam
java.io
paket, sebagai gantinya gunakanjava.nio
paket. Yang terakhir memilikiFileLock
kelas. Anda dapat menerapkan kunci keFileChannel
.sumber
Jika Anda dapat menggunakan Java NIO ( JDK 1.4 atau lebih tinggi ), maka saya rasa Anda sedang mencari
java.nio.channels.FileChannel.lock()
FileChannel.lock ()
sumber
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine
menggunakan java.nio.channels.FileLock bersama dengan java.nio.channels.FileChannel
sumber
Ini mungkin bukan yang Anda cari, tetapi untuk mengetahui masalah dari sudut lain ....
Apakah kedua proses Java ini mungkin ingin mengakses file yang sama di aplikasi yang sama? Mungkin Anda bisa memfilter semua akses ke file melalui satu metode tersinkronisasi (atau, bahkan lebih baik, menggunakan JSR-166 )? Dengan begitu, Anda dapat mengontrol akses ke file, dan bahkan mungkin mengantrekan permintaan akses.
sumber
Gunakan RandomAccessFile, dapatkan salurannya, lalu panggil lock (). Saluran yang disediakan oleh aliran masukan atau keluaran tidak memiliki hak yang cukup untuk mengunci dengan benar. Pastikan untuk memanggil unlock () di blok terakhir (menutup file tidak selalu membuka kunci).
sumber
Di bawah ini adalah contoh kode potongan untuk mengunci file sampai prosesnya dilakukan oleh JVM.
sumber