공유 저장소에서 파일을 읽고 쓰는 여러 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과 같은 상황. 오류 메시지에서 볼 수 있듯이
어떤 아이디어? ..
Windows에서 Java의 NIO 파일 잠금 메커니즘이 쓸모 없다는 것을 의미합니까? 나는. 파일이 현재 다른 프로세스에 의해 읽고 쓰여지고 있다면 결코 파일 잠금을 얻지 못할 것입니다. – Lopotun
@Lopotun 이는 Windows가 이미 열린 파일을위한 파일 잠금 메커니즘을 가지고 있음을 의미합니다. 둘이 필요하지 않습니다. – EJP
그렇다면 매우 중요한 포인트입니다. 전에 명시 적으로 언급 한 것을 본 적이 없습니다. 나는이 사건에 대해 더 구체적인 예외가 있었으면 좋겠다. 일반적인 FileNotFoundException은 혼동합니다. – Lopotun