동시에 파일을 업데이트하거나 읽는 등 여러 프로그램이 동일한 파일을 처리하는 경우가 많습니다. 이러한 문제는 해결되어야 하며, 그렇지 않으면 혼란이 뒤따를 수 있습니다. 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) 채널은 FileLock(파일 잠금) 개체를 얻기 위해 tryLock() 또는 lock() 메서드를 호출합니다. 이 프로세스를 파일 잠금이라고도 합니다. 예를 들면 다음과 같습니다.
FileLocklock=channel.tryLock();
파일 잠금 개체가 생성된 후에는 모든 프로그램에서 파일을 작동하거나 잠글 수 없습니다. 파일을 잠근 후 파일을 읽거나 쓰려면 FileLock 객체가 release()를 호출하여 파일 잠금을 해제하도록 해야 합니다. 예를 들면 다음과 같습니다.
잠금.해제();
예를 들어, Java 프로그램은 버튼을 클릭할 때마다 파일 잠금을 해제하고 파일에서 텍스트 한 줄을 읽은 다음 즉시 잠급니다. Java 프로그램이 실행 중인 경우, 사용자는 현재 Java 프로그램에서 잠긴 파일을 다른 프로그램에서 조작할 수 없습니다. 예를 들어, Windows에서 제공하는 "메모장" 프로그램(Notepad.exe)으로는 현재 Java 프로그램에서 잠긴 파일을 저장할 수 없습니다. 운영 체제.
Main.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(Main.java);WindowFileLockwin=newWindowFileLock(파일);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){}}}