Saya ingin diberi tahu jika file telah diubah di sistem file. Saya tidak menemukan apa-apa selain utas yang memeriksa properti File lastModified dan jelas solusi ini tidak optimal.
Terima kasih atas semua tanggapannya. Karena kebutuhan saya kecil (saya hanya perlu memuat ulang file properti yang diubah di aplikasi web saya..terutama karena memulai ulang seluruh aplikasi web agak lambat), saya akan tetap menggunakan model jajak pendapat. Setidaknya sekarang saya tahu bahwa tidak ada solusi sederhana untuk kasus-kasus ini.
cheng81
14
Hanya sebuah catatan. Ketika kami memecahkan masalah ini sebelum kami menemukan bahwa file besar cenderung masuk dengan lambat, dan mekanisme polling sering menemukan file baru atau file yang diubah sebelum sepenuhnya ditulis. Untuk mengatasi ini, solusi 'dua gigitan' diadopsi. Poller melihat sebuah file telah berubah, tetapi tidak memberi tahu sistem tentang file baru / yang diubah sampai terlihat sama untuk dua polling: yaitu telah stabil. Menyembuhkan banyak error badfile.
Steve Powell
1
Selain itu, Tomcat mengalami masalah itu saat menjatuhkan file WAR besar ke folder webapps dari sumber jarak jauh dan telah melakukannya untuk waktu yang lama.
John Rix
Jawaban:
21
Pada tingkat rendah, satu-satunya cara untuk memodelkan utilitas ini adalah dengan melakukan polling thread pada direktori dan mengawasi atribut file. Tapi Anda bisa menggunakan pola untuk mengembangkan adaptor untuk utilitas semacam itu.
Misalnya server aplikasi j2ee seperti Tomcat dan lainnya memiliki fitur muat otomatis di mana segera setelah perubahan deskripsi penyebaran atau perubahan kelas servlet, aplikasi dimulai ulang.
Anda dapat menggunakan perpustakaan dari server tersebut karena sebagian besar kode tomcat dapat digunakan kembali dan sumber terbuka.
API tersebut sangat tidak memadai, tidak memberikan pemberitahuan untuk peristiwa penutupan file di Linux. Jadi, dalam kasus sederhana, ketika file ditutup, salin ke direktori lain tidak berfungsi.
binarytemple_picsolve
117
Saya telah menulis monitor file log sebelumnya, dan saya menemukan bahwa dampak pada kinerja sistem polling atribut dari satu file, beberapa kali dalam satu detik, sebenarnya sangat kecil.
Java 7, sebagai bagian dari NIO.2 telah menambahkan WatchService API
WatchService API dirancang untuk aplikasi yang perlu diberi tahu tentang peristiwa perubahan file.
saya melihat contoh sebagai direktori menonton, tetapi bagaimana dengan file individu?
Archimedes Trajano
@ArchimedesTrajano API memberi tahu Anda bila file dalam direktori telah berubah. Peristiwa yang dipicu termasuk nama file yang telah berubah. Jadi, Anda dapat menangani peristiwa untuk file atau file tertentu dan mengabaikan yang lain.
Ada lib bernama jnotify yang membungkus inotify di linux dan juga mendukung untuk windows. Tidak pernah menggunakannya dan saya tidak tahu seberapa bagusnya, tapi patut dicoba menurut saya.
Ini bekerja dengan sempurna dan sangat mudah digunakan. Saya telah menggunakan inotify selama bertahun-tahun. Ini cepat, stabil, dan dapat diandalkan
oᴉɹǝɥɔ
8
Java commons-io memiliki FileAlterationObserver . itu melakukan polling dalam kombinasi dengan FileAlterationMonitor. Mirip dengan commons VFS. Keuntungannya adalah ia memiliki lebih sedikit dependensi.
sunting: Lebih sedikit ketergantungan tidak benar, mereka opsional untuk VFS. Tetapi menggunakan File java, bukan lapisan abstraksi VFS.
Bisakah Anda lebih spesifik atau memposting tautan ke dokumentasi? Tidak dapat menemukan apapun tentang ini ...
Luciano
Sepertinya itu paketnya java.nio.file. Lihat tutorial .
David L.
4
Saya menjalankan potongan kode ini setiap kali saya pergi untuk membaca file properti, hanya benar-benar membaca file tersebut jika telah dimodifikasi sejak terakhir kali saya membacanya. Semoga ini bisa membantu seseorang.
privatelong timeStamp;privateFile file;privateboolean isFileUpdated(File file ){this.file = file;this.timeStamp = file.lastModified();if(this.timeStamp != timeStamp ){this.timeStamp = timeStamp;//Yes, file is updatedreturntrue;}//No, file is not updatedreturnfalse;}
Pendekatan serupa digunakan di Log4J FileWatchdog.
Jika Anda ingin berpisah dengan sejumlah uang, JNIWrapper adalah pustaka yang berguna dengan Winpack, Anda akan bisa mendapatkan peristiwa sistem file pada file tertentu. Sayangnya hanya windows.
Jika tidak, beralih ke kode native tidak selalu merupakan hal yang buruk terutama jika penawaran terbaik adalah mekanisme polling yang bertentangan dengan peristiwa native.
Saya perhatikan bahwa operasi sistem file Java dapat menjadi lambat di beberapa komputer dan dapat dengan mudah mempengaruhi kinerja aplikasi jika tidak ditangani dengan baik.
Anda juga dapat mempertimbangkan Apache Commons JCI (Java Compiler Interface). Meskipun API ini tampaknya difokuskan pada kompilasi dinamis kelas, ia juga menyertakan kelas dalam API-nya yang memantau perubahan file.
Ada pustaka lintas desktop komersial untuk menonton file dan folder yang disebut JxFileWatcher. Itu dapat diunduh dari sini:
http://www.teamdev.com/jxfilewatcher/
Polling properti file yang terakhir diubah adalah solusi yang sederhana namun efektif. Cukup tentukan kelas yang memperluas saya FileChangedWatcherdan terapkan onModified()metode:
Mirip dengan jawaban lain, inilah cara saya melakukannya menggunakan File, Timer, dan TimerTask agar ini berjalan sebagai thread latar belakang polling pada interval yang ditentukan.
Jawaban:
Pada tingkat rendah, satu-satunya cara untuk memodelkan utilitas ini adalah dengan melakukan polling thread pada direktori dan mengawasi atribut file. Tapi Anda bisa menggunakan pola untuk mengembangkan adaptor untuk utilitas semacam itu.
Misalnya server aplikasi j2ee seperti Tomcat dan lainnya memiliki fitur muat otomatis di mana segera setelah perubahan deskripsi penyebaran atau perubahan kelas servlet, aplikasi dimulai ulang.
Anda dapat menggunakan perpustakaan dari server tersebut karena sebagian besar kode tomcat dapat digunakan kembali dan sumber terbuka.
sumber
Saya telah menulis monitor file log sebelumnya, dan saya menemukan bahwa dampak pada kinerja sistem polling atribut dari satu file, beberapa kali dalam satu detik, sebenarnya sangat kecil.
Java 7, sebagai bagian dari NIO.2 telah menambahkan WatchService API
sumber
Saya menggunakan VFS API dari Apache Commons, berikut adalah contoh cara memantau file tanpa banyak berdampak pada kinerja:
DefaultFileMonitor
sumber
Ada lib bernama jnotify yang membungkus inotify di linux dan juga mendukung untuk windows. Tidak pernah menggunakannya dan saya tidak tahu seberapa bagusnya, tapi patut dicoba menurut saya.
sumber
Java commons-io memiliki FileAlterationObserver . itu melakukan polling dalam kombinasi dengan FileAlterationMonitor. Mirip dengan commons VFS. Keuntungannya adalah ia memiliki lebih sedikit dependensi.
sunting: Lebih sedikit ketergantungan tidak benar, mereka opsional untuk VFS. Tetapi menggunakan File java, bukan lapisan abstraksi VFS.
sumber
"Lebih banyak fitur NIO" memiliki fungsi file watch, dengan implementasi yang bergantung pada OS yang mendasarinya. Harus di JDK7.
sumber
java.nio.file
. Lihat tutorial .Saya menjalankan potongan kode ini setiap kali saya pergi untuk membaca file properti, hanya benar-benar membaca file tersebut jika telah dimodifikasi sejak terakhir kali saya membacanya. Semoga ini bisa membantu seseorang.
Pendekatan serupa digunakan di Log4J
FileWatchdog
.sumber
Anda dapat mendengarkan perubahan file menggunakan FileReader. Silakan lihat contoh di bawah ini
sumber
Jika Anda ingin berpisah dengan sejumlah uang, JNIWrapper adalah pustaka yang berguna dengan Winpack, Anda akan bisa mendapatkan peristiwa sistem file pada file tertentu. Sayangnya hanya windows.
Lihat https://www.teamdev.com/jniwrapper .
Jika tidak, beralih ke kode native tidak selalu merupakan hal yang buruk terutama jika penawaran terbaik adalah mekanisme polling yang bertentangan dengan peristiwa native.
Saya perhatikan bahwa operasi sistem file Java dapat menjadi lambat di beberapa komputer dan dapat dengan mudah mempengaruhi kinerja aplikasi jika tidak ditangani dengan baik.
sumber
Anda juga dapat mempertimbangkan Apache Commons JCI (Java Compiler Interface). Meskipun API ini tampaknya difokuskan pada kompilasi dinamis kelas, ia juga menyertakan kelas dalam API-nya yang memantau perubahan file.
Contoh: http://commons.apache.org/jci/usage.html
sumber
Spring Integration menyediakan mekanisme yang bagus untuk menonton Direktori dan file: http://static.springsource.org/spring-integration/reference/htmlsingle/#files . Cukup yakin ini lintas platform (saya telah menggunakannya di mac, linux, dan windows).
sumber
Ada pustaka lintas desktop komersial untuk menonton file dan folder yang disebut JxFileWatcher. Itu dapat diunduh dari sini: http://www.teamdev.com/jxfilewatcher/
Anda juga dapat melihatnya beraksi secara online: http://www.teamdev.com/jxfilewatcher/onlinedemo/
sumber
Polling properti file yang terakhir diubah adalah solusi yang sederhana namun efektif. Cukup tentukan kelas yang memperluas saya
FileChangedWatcher
dan terapkanonModified()
metode:sumber
Mirip dengan jawaban lain, inilah cara saya melakukannya menggunakan File, Timer, dan TimerTask agar ini berjalan sebagai thread latar belakang polling pada interval yang ditentukan.
sumber