سؤال

لديّ عملية سيتم استدعاؤها بشكل متكرر من CRON لقراءة ملف له أوامر ذات صلة بحركة معينة. تحتاج عمليتي إلى القراءة والكتابة إلى ملف البيانات هذا - واحتفظ بها لمنع العمليات الأخرى من لمسها خلال هذا الوقت. يمكن تنفيذ عملية منفصلة تمامًا من قبل المستخدم إلى (محتمل) للكتابة/إلحاق ملف البيانات نفسه. أريد أن تلعب هاتين العمليتين بشكل جيد والوصول إلى الملف في وقت واحد فقط.

بدا أن Nio FileLock هو ما احتاجه (أقل من كتابة ملفات نوع الإشارة الخاصة بي) ، لكنني أواجه مشكلة في قراءتها. يمكنني قفل والكتابة على ما يرام ، ولكن عند محاولة إنشاء القفل عند القراءة ، أحصل على غير مؤلف من غير ذلك. هل من الممكن حتى قفل ملف للقراءة؟ يبدو أن العشوائي هو أقرب إلى ما أحتاجه ، لكنني لا أرى كيفية تنفيذ ذلك.

هنا هو الرمز الذي يفشل:

FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null) 
{
  System.out.println("Locked File");
  BufferedReader in = new BufferedReader(new InputStreamReader(fin));
  System.out.println(in.readLine());
          ...

يتم إلقاء الاستثناء على خط FileLock.

java.nio.channels.NonWritableChannelException
 at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
 at java.nio.channels.FileChannel.tryLock(Unknown Source)
 at Mover.run(Mover.java:74)
 at java.lang.Thread.run(Unknown Source)

بالنظر إلى Javadocs ، كما يقول

استثناء لم يتم التحقق منه عند إجراء محاولة للكتابة إلى قناة لم يتم فتحها في الأصل للكتابة.

لكني لست بحاجة بالضرورة إلى الكتابة إليها. عندما أحاول إنشاء ملف fileOutPustream ، وما إلى ذلك. لأغراض الكتابة ، يكون الأمر سعيدًا حتى أحاول فتح ملف fileInputStream على نفس الملف.

هل كانت مفيدة؟

المحلول

(أ) هل تدرك أن قفل الملف لن يمنع العمليات الأخرى من لمسه ما لم يستخدم أيضًا الأقفال؟
(ب) عليك أن تقفل عبر قناة قابلة للكتابة. احصل على القفل عبر أ RandomAccessFile في وضع "RW" ثم افتح FileInputStream. تأكد من إغلاق كليهما!

نصائح أخرى

سيكون من الأفضل إذا قمت بإنشاء القفل باستخدام tryLock(0L, Long.MAX_VALUE, true).

هذا يخلق قفل مشترك وهو الشيء الصحيح الذي يجب القيام به للقراءة.

tryLock() هو اختصار ل tryLock(0L, Long.MAX_VALUE, false), ، أي أنه يطلب قفل كتابة حصري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top