문제

Windows Environment에서 Java와 함께 파일을 잠그려고합니다. Filelock 그리고 문제가 발생했습니다. 파일을 잠그면 적어도 어느 정도는 다른 프로세스에서 여전히 액세스 할 수 있습니다.

예제 코드는 다음과 같습니다.

public class SimpleLockExample {
    public static void main(String[] args) throws Exception {
        String filename = "loremlipsum.txt";

        File file = new File(filename);
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        FileChannel channel = raf.getChannel();

        FileLock lock = null;
        try {
            lock = channel.tryLock();
            String firstLine = raf.readLine();
            System.out.println("First line of file : " + firstLine);
            waitForEnter();
            lock.release();
        } catch (OverlappingFileLockException e) {
            e.printStackTrace();
        }

        lock.release();
        System.out.println("Lock released");

        channel.close();
    }

    private static void waitForEnter() throws Exception {
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();
        reader.close();
    }
}

이제이 예제로 파일을 잠그면 잠겨 있습니다.

  • Windows에서는 삭제할 수 없습니다
  • 일식은 그것을 열기를 거부합니다

...하지만 여전히 완전히 방탄이 아닙니다.

  • 예를 들어 Scite (텍스트 편집기)로 열면 콘텐츠가 표시되지 않지만 파일을 저장하기 위해 선택하면 (열린대로 비어 있거나 일부 내용이 작성된 상태) 성공하면 파일의 내용이 지워집니다. .

Windows의 Java와 함께 다른 프로세스에 의해 파일이 완전히 덮어 쓰거나 지우지 않도록하는 방법이 있습니까?

내가 올바르게 이해 한 경우, 독점 잠금 ATM을 사용하고 있습니다. 공유 잠금 장치에는 더 많은 일을 할 수 있습니다.

이 테스트는 Windows 2000으로 실행되었습니다.

Br, touko

도움이 되었습니까?

해결책

까다 롭고 Filelock API 자체는별로 약속하지 않습니다.

이 파일 잠금 API는 기본 운영 체제의 기본 잠금 기능에 직접 매핑하기위한 것입니다. 따라서 파일에 보유 된 잠금 장치는 해당 프로그램이 작성된 언어에 관계없이 파일에 액세스 할 수있는 모든 프로그램에 표시되어야합니다.

잠금 장치가 실제로 잠긴 영역의 내용에 액세스하는 것을 방지하는지 여부는 시스템 의존적이므로 지정되지 않습니다. 일부 시스템의 기본 파일 잠금 시설은 단지 자문 일뿐입니다. 즉, 프로그램은 데이터 무결성을 보장하기 위해 알려진 잠금 프로토콜을 협력해야합니다. 다른 시스템에서 기본 파일 잠금은 필수입니다. 즉, 하나의 프로그램이 파일의 영역을 잠그는 경우 다른 프로그램이 실제로 잠금을 위반하는 방식으로 해당 영역에 액세스하는 것을 방지합니다. 아직 다른 시스템에서는 기본 파일 잠금이 권고 여부에 관계없이 파일별로 구성 할 수 있습니다. 플랫폼 전체에서 일관되고 올바른 동작을 보장하기 위해이 API에서 제공 한 잠금 장치를 자문 잠금 장치 인 것처럼 사용하는 것이 좋습니다.

이상하게도 개발중인 파일 잠금 API에 대한 논의는 Windows OS가 제공했다고 주장했습니다. 필수적인 잠금 및 UNIX 만 자문 잠금. 따라서 그 읽기에서 코드는 Windows에서 잘 작동 할 것으로 기대할 수 있습니다.

편집자가 파일을 임시 파일 생성으로 수정 한 다음 새 버전으로 잠긴 파일의 버전을 교정하기 위해 디렉토리 항목을 조작하지 않는 것이 무슨 일이 일어나고 있는지 궁금합니다. Windows가 그러한 행동을 허용합니까?

필요한 제어 수준을 얻으려면 JNI에 의지 해야하는지 궁금합니다.

다른 팁

.trylock ()에 대한 호출은 잠금을 얻지 못하면 NULL을 반환 할 수 있습니다. Javadoc에서 :

새로 접수 된 잠금 잠금 장치를 나타내는 잠금 객체 또는 다른 프로그램이 겹치는 잠금 장치를 보유하고 있기 때문에 잠금을 얻을 수없는 경우 NULL

또한 코드가 현재 파일을 엽니 다 그리고 자물쇠를 얻으려고합니다. 대신 잠금 장치를 얻으려고 노력하고 일단 파일을 열고 파일을 읽고 파일을 닫은 다음 잠금을 포기해야합니다. 그리고 잠금을 포기하십시오 finally {} 조항, 코드가 잠금 장치와 함께 예외를 던지는 경우를 대비하여 조항. (일부 파일이 잠겨 있었기 때문에 Windows 시스템을 재부팅해야 했습니까?)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top