Java를 사용하여 파일을 잠그는 방법 (가능한 경우) 나열하고이를 처리하기 위해 목록의

FileReader를 사용하여 파일을 여는 Java 프로세스가 있습니다. 다른 (Java) 프로세스가이 파일을 열지 못하도록하거나 적어도 두 번째 프로세스에 파일이 이미 열려 있음을 알리려면 어떻게해야합니까? 파일이 열려 있으면 자동으로 두 번째 프로세스에서 예외가 발생합니까 (내 문제가 해결됨) 아니면 첫 번째 프로세스에서 일종의 플래그 또는 인수를 사용하여 명시 적으로 열어야합니까?

명확히하기 위해 :

폴더를 나열하고이를 처리하기 위해 목록의 각 파일을 여는 Java 앱이 있습니다. 각 파일을 차례로 처리합니다. 각 파일의 처리는 파일을 읽고 내용에 따라 계산하는 것으로 구성되며 약 2 분 정도 소요됩니다. 또한 동일한 작업을 수행하지만 파일에 쓰는 다른 Java 앱도 있습니다. 내가 원하는 것은 이러한 앱을 동시에 실행할 수 있으므로 시나리오가 이와 같이 진행되는 것입니다. ReadApp은 폴더를 나열하고 파일 A, B, C를 찾습니다. 파일 A를 열고 읽기를 시작합니다. WriteApp은 폴더를 나열하고 파일 A, B, C를 찾습니다. 파일 A를 열고 (예외 또는 어떤 방식 으로든) 열려있는 것을 확인하고 파일 B로 이동합니다. ReadApp은 파일 A를 완료하고 B로 계속합니다. 열려 있고 C로 계속됩니다. WriteApp이 t ReadApp이 동일한 파일을 읽는 동안 쓰거나 그 반대의 경우도 마찬가지입니다. 그들은 다른 과정입니다.



답변

FileChannel.lock은 아마도 원하는 것입니다.

try (
    FileInputStream in = new FileInputStream(file);
    java.nio.channels.FileLock lock = in.getChannel().lock();
    Reader reader = new InputStreamReader(in, charset)
) {
    ...
}

(면책 조항 : 코드가 컴파일되지 않았으며 확실히 테스트되지 않았습니다.)

FileLock 에 대한 API 문서 의 “플랫폼 종속성”섹션을 참고하십시오 .


답변

java.io패키지 의 클래스를 사용하지 말고 대신 package를 사용하십시오 java.nio. 후자는 FileLock수업이 있습니다. 에 잠금을 적용 할 수 있습니다 FileChannel.

 try {
        // Get a file channel for the file
        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Use the file channel to create a lock on the file.
        // This method blocks until it can retrieve the lock.
        FileLock lock = channel.lock();

        /*
           use channel.lock OR channel.tryLock();
        */

        // Try acquiring the lock without blocking. This method returns
        // null or throws an exception if the file is already locked.
        try {
            lock = channel.tryLock();
        } catch (OverlappingFileLockException e) {
            // File is already locked in this thread or virtual machine
        }

        // Release the lock - if it is not null!
        if( lock != null ) {
            lock.release();
        }

        // Close the file
        channel.close();
    } catch (Exception e) {
    }

답변

Java NIO ( JDK 1.4 이상 )를 사용할 수 있다면 다음을 찾고 있다고 생각합니다.java.nio.channels.FileChannel.lock()

FileChannel.lock ()


답변


답변

이것은 당신이 찾고있는 것이 아닐 수도 있지만 다른 각도에서 문제를 제기하기 위해 ….

동일한 애플리케이션에서 동일한 파일에 액세스하려는이 두 Java 프로세스가 있습니까? 아마도 단일 동기화 방법을 통해 파일에 대한 모든 액세스를 필터링 할 수 있습니까 (또는 더 나은 방법은 JSR-166 사용 )? 이렇게하면 파일에 대한 액세스를 제어 할 수 있으며 액세스 요청을 대기열에 넣을 수도 있습니다.


답변

RandomAccessFile을 사용하여 채널을 가져온 다음 lock ()을 호출하십시오. 입력 또는 출력 스트림에서 제공하는 채널에 제대로 잠글 수있는 충분한 권한이 없습니다. finally 블록에서 unlock ()을 호출해야합니다 (파일을 닫아도 반드시 잠금이 해제되는 것은 아닙니다).


답변

다음은 JVM이 처리 할 때까지 파일을 잠그는 샘플 스 니펫 코드입니다.

 public static void main(String[] args) throws InterruptedException {
    File file = new File(FILE_FULL_PATH_NAME);
    RandomAccessFile in = null;
    try {
        in = new RandomAccessFile(file, "rw");
        FileLock lock = in.getChannel().lock();
        try {

            while (in.read() != -1) {
                System.out.println(in.readLine());
            }
        } finally {
            lock.release();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}