2011-04-22 3 views
3

디스크에 파일을 쓰는 Java 응용 프로그램이 있습니다. 문제는 리눅스가 윈도우처럼 파일을 잠그지 않기 때문에 누군가가 파일을 쓰고있는 그대로 삭제할 수 있다는 것이다. 이런 일이 발생하면 Java 응용 프로그램은 파일이 계속 존재하는 것처럼 추악 해지며 심지어 예외없이 더 많은 쓰기를 허용합니다.삭제 된 Java에서 파일을 작성하는 자바 쓰기 파일

file.exists()에 대한 확인이 추가되었지만 성능이 거의 50 % 정도 저하됩니다. 누구든지이 문제를 해결하고 성능을 유지하는 방법에 관해서 영리한 아이디어가 있습니까?

+0

우리 제품에서도 동일한 문제가 발생했습니다. – AbdullahC

+0

그룹 권한을 사용하고 디렉터리를 잠글 수 있습니다. 귀하의 프로그램은 적절한 권한을 가진 그룹의 유일한 사용자 일 수 있습니다. 그것은 진흙이지만 놀랍게도 삭제를 줄이는 데 도움이 될 수 있습니다. – karakuricoder

+0

권한이 도움이되지 않습니다. 결국 루트 (예를 들어)는 모든 권한을가집니다. 답장을 보내 주셔서 감사합니다. –

답변

2

유닉스에서 "파일"은 이름이없는 i- 노드 (데이터 포함)와 그 i- 노드를 가리키는 디렉토리의 0 + 항목입니다. 0 이상. 즉, 이름을 삭제할 수 있지만 i-node는 여전히 존재할 수 있으며 열려있는 경우 해당 노드에 쓰기 및 읽기가 가능함을 의미합니다.

하지만 모든 쓰기 작업에서 f.exists()를 확인할 필요는 없습니다. 한 번씩 (15 초에 한번)합시다. 당신의 공연은별로 다 치지 않을 것입니다.

+0

불행히도 우리는 아무것도 놓치지 않을 수있는 옵션이 아닙니다. 유일한 해결책은 파일 공백을 정지 간격으로 사용하는 것입니다. 도움을 주셔서 감사합니다 – user671731

+0

권한이 당신을 도울 수 없습니다. 루트 또는 그룹 회원이 파일을 삭제합니다. –

+0

예, 이해합니다.하지만 성능이 너무 높아서 파일을 읽을 때마다 파일이 존재하는지 확인하지 못합니다. 손가락을 교차시켜 우발적 인 삭제가 없기를 바랍니다. – user671731

7

"문제"로 간주되는 것은 재미 있습니다. 유닉스에서 이빨을 자르는 사람들은 파일 잠금에 대한 Windows의 접근 방식이 힘들고 고통 스럽다고 생각합니다.

(주로)이 문제를 방지하기 위해 파일 권한을 사용할 수 없다면 File.exists()가 유일한 해결책이라고 생각하지만 성능 문제를 일으키는 경우 File.exists()가 덜 자주 호출 할 수 있습니다. 때때로이 상태를 확인하기 위해 깨어 난 "사신"스레드.

+0

. 나는 파일이 "잠겨 있지"않은 문제라고 생각하지 않는다, 나는 단지 그것이 자바가 오류를 내지 않는 문제라고 생각한다. 존재하지 않는 파일에 어떻게 쓸 수 있는지 궁금합니다. OS가 삭제 된 파일에 파일 핸들을 던지지 않습니까? – user671731

+4

이것은 자바가 아닙니다. 모든 코드가 똑같은 것을 할 것입니다. 파일의 커널 데이터 구조는 프로세스가 참조하는 한 사라지지 않습니다. 유닉스는 터미널, 네트워크, 모든 종류의 장치, 아무 곳에도 가지지 않는 특별한 파일 인 "/ dev/null"조차도 모든 것이 파일이라는 개념을 바탕으로 만들어졌다. 그래서 파일에 쓰지 않는 개념 육체적으로 존재하는 것은 외국이 아닙니다. –

+1

파일이 여전히 존재하며 이름 만 사라졌습니다. 유닉스 배우기! ;) –

2

귀하의 프로그램 이식성을 줄이지 않으려면 파일을 삭제할 때 통보 받기 위해 jnotify과 같은 것을 사용할 수 있습니다.

이 기능은 나중에 JDK 7에 포함될 것입니다. 이는 나중에 나중에 jnotify에 대한 의존성을 제거 할 수 있음을 의미합니다.

+0

오우, 그들은 그것을 jnotify라고 지었습니까? 나는 지금 pnotify, knotify, qnotify, 등등, 될 것 같아? – Duck

0

파일을 임시 이름으로 쓰는 것을 고려하십시오. 쓰기가 완료된 후 파일의 이름/위치를 바꾸거나 파일을 이동하십시오.

관련 문제