2012-09-20 3 views
1

공유 저장소에서 파일을 읽고 쓰는 여러 JVM간에 응용 프로그램 (Java5)이 분산되어 있습니다 (저장소는 Windows에서 관리됩니다). 내가 파일 쓰기 전용/공유 잠금을 사용하고 싶었/다음과 같이 :파일 잠금을 얻기 전에 Java5 FileInputStream이 실패합니다.

FileOutputStream fos = null; 
    FileLock lock = null; 
    ObjectOutputStream oos = null; 
    try { 
     fos = new FileOutputStream(new File("//share/test.dat")); // HERE IT MAY THROW FileNotFoundException... 
     lock = fos.getChannel().lock(); // ... and I won't acquire a lock. 
     oos = new ObjectOutputStream(fos); 
     oos.writeObject(value); 
     return true; 
    } catch (Exception e) { 
     // Log it. 
    } finally { 
     // Close locks and I/O streams. 
    } 

문제 : JVM1 현재 파일 TEST.DAT을 읽고 및 JVM2 후 동일한 파일 FileNotFoundException이에 쓰기를 시도하는 경우 ("다른 프로세스"에서 사용 중이기 때문에 프로세스가 파일에 액세스 할 수 없습니다. "new FileOutputStream (new File ("// share/test.dat "))" "행에서 JVM2에 발생합니다. Catch22 케이스 인 것 같습니다. 한편으로는 I/O 스트림을 얻기 위해 자물쇠를 얻고 싶습니다. 다른 한편으로는 잠금을 획득하기 위해 I/O 스트림이 있어야합니다. 내가 볼 수 있듯이, RandomAccessFile과 같은 상황. 오류 메시지에서 볼 수 있듯이

어떤 아이디어? ..

답변

1

, 윈도우는 당신이 당신이하려는 일을하지 않습니다. 생각할 때 Windows 오류 자체를 잠금 조건으로 취급 할 수 있습니다. 어쨌든 열린 자물쇠와 자물쇠 사이의 타이밍 창 때문에 여기에 동질적인 문제가 있습니다. Windows는 당신에게 호의적입니다. 한 번.

+0

Windows에서 Java의 NIO 파일 잠금 메커니즘이 쓸모 없다는 것을 의미합니까? 나는. 파일이 현재 다른 프로세스에 의해 읽고 쓰여지고 있다면 결코 파일 잠금을 얻지 못할 것입니다. – Lopotun

+0

@Lopotun 이는 Windows가 이미 열린 파일을위한 파일 잠금 메커니즘을 가지고 있음을 의미합니다. 둘이 필요하지 않습니다. – EJP

+0

그렇다면 매우 중요한 포인트입니다. 전에 명시 적으로 언급 한 것을 본 적이 없습니다. 나는이 사건에 대해 더 구체적인 예외가 있었으면 좋겠다. 일반적인 FileNotFoundException은 혼동합니다. – Lopotun

관련 문제