มักเกิดกรณีที่หลายโปรแกรมประมวลผลไฟล์เดียวกัน เช่น การอัพเดตหรือการอ่านไฟล์พร้อมกัน ปัญหาดังกล่าวควรได้รับการจัดการ ไม่เช่นนั้นความวุ่นวายอาจตามมา หลังจาก 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() เพื่อปลดล็อคไฟล์ ตัวอย่างเช่น:
ล็อค.ปล่อย();
ตัวอย่างเช่น โปรแกรม 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(นี้);เพิ่ม(newJScrollPane(ข้อความ),BorderLayout.CENTER);เพิ่ม(ปุ่ม,BorderLayout.SOUTH);setSize(300,400);setVisible(จริง); 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(ผู้ยกเว้น){}}}