غالبًا ما تقوم عدة برامج بمعالجة نفس الملف، مثل تحديث الملف أو قراءته في نفس الوقت. وينبغي التعامل مع مثل هذه القضايا، وإلا قد تترتب على ذلك الفوضى. بعد JDK 1.4، توفر Java وظيفة قفل الملفات التي يمكن أن تساعد في حل مثل هذه المشكلات.
توجد فئات FileLock وFileChannel في حزم java.nio وjava.nio.channels على التوالي. يمكن استخدام أقفال الملفات عندما تقوم تدفقات الإدخال والإخراج بقراءة وكتابة الملفات. يستخدم ما يلي فئة RandomAccessFile لتوضيح استخدام أقفال الملفات.
يمكن للتدفق الذي تم إنشاؤه بواسطة RandomAccessFile استخدام أقفال الملفات عند قراءة الملفات وكتابتها، وطالما لم يتم تحرير القفل، فلن تتمكن البرامج الأخرى من تشغيل الملف المقفل.
خطوات استخدام قفل الملفات هي كما يلي:
1) استخدم أولاً دفق RandomAccessFile لإنشاء كائن دفق يشير إلى الملف، ويجب أن تكون سمة القراءة والكتابة للكائن rw، على سبيل المثال:
RandomAccessFileinput=newRandomAccessFile(Main.java,rw);
2) يستدعي دفق الإدخال الأسلوب getChannel() للحصول على كائن FileChannel (قناة) متصل بالملف الأساسي، على سبيل المثال:
FileChannelchannel=input.getChannel();
3) تستدعي القناة طريقة TryLock() أو lock() للحصول على كائن FileLock (قفل الملف)، وتسمى هذه العملية أيضًا بقفل الملف، على سبيل المثال:
FileLocklock=channel.tryLock();
بعد إنشاء كائن قفل الملف، سيتم منع أي برنامج من تشغيل الملف أو قفله. بعد قفل الملف، إذا كنت تريد قراءة الملف أو كتابته، فيجب عليك السماح لكائن FileLock باستدعاء Release() لتحرير قفل الملف، على سبيل المثال:
lock.release();
على سبيل المثال، يقوم برنامج Java بتحرير قفل ملف مع كل نقرة على زر، وقراءة سطر من النص من الملف، ثم قفله على الفور. عند تشغيل برنامج Java، لا يمكن للمستخدمين استخدام برامج أخرى لتشغيل الملفات المقفلة بواسطة برنامج Java الحالي، على سبيل المثال، لا يمكن للمستخدمين حفظ الملفات المقفلة بواسطة برنامج Java الحالي باستخدام برنامج "Notepad" (Notepad.exe) الذي يوفره Windows. نظام التشغيل .
main.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(Main.java);WindowFileLockwin=newWindowFileLock(file);win.setTitle(استخدام قفل الملف);}}
WindowFileLock.java
importjava.io.*;importjava.nio.*;importjava.nio.channels.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassWindowFileLockextendsJframeimplementsActionListener{JTextAreatext;JButtonbutton;Filefile;RandomAccessFileinput; FileChannelchannel;FileLocklock;WindowFileLock(Filef){file=f;try{input=newRandomAccessFile(file,rw);channel=input.getChannel();lock=channel.tryLock();}catch(Exceptionexp){}text=newJTextArea ();button=newJButton(اقرأ سطر);button.addActionListener(this);add(newJScrollPane(text),BorderLayout.CENTER);add(button,BorderLayout.SOUTH);setSize(300,400);setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){try{lock.release();StringlineString=input.readLine();text.append(n+lineString);lock=channel.tryLock();if(lineString ==null)input. Close();}catch(Exceptionee){}}}