2008-09-23 2 views
12

들어오는 XML 파일을 폴더에서 모니터링하는 Java 응용 프로그램이 있습니다. 새 파일이 발견되면 현재 업데이트 중이 아니며 닫혀있는 파일을 테스트해야합니다. 내 생각은 File.canWrite()을 사용하여이를 테스트하는 것입니다. 이 문제가 있습니까? 파일이 완전히 작성되었는지 테스트하는 좋은 방법입니까? 나는 주위를 던지고Java 파일 메소드 "canWrite()"가 잠금을 지원합니까?

다른 아이디어가 있습니다 :

  • 닫는 태그가 들어오는 XML 파일 및 테스트 을 구문 분석합니다.
  • EoF 문자를 확인하십시오.

이러한 방법 중 하나라도 모든 시나리오를 처리 할 수 ​​있는지 잘 모르겠습니다.

답변

14

아니요, canWrite는이 용도로 적합하지 않습니다. 일반적으로 파일은 다른 프로세스가 쓰고 있어도 쓰기 가능합니다.

잠금을 조정하려면 상위 수준의 프로토콜이 필요합니다. 단일 플랫폼에서이 코드를 사용하려는 경우 NIO's FileLock facility을 사용할 수 있습니다. 그러나 문서를주의 깊게 읽으십시오. 많은 플랫폼에서 잠금 장치는 권고 사항입니다.

또 다른 접근법은 하나의 프로세스가 프로세스가 인식하지 못하는 이름으로 파일을 작성한 다음 쓰기가 완료되면 파일을 인식 가능한 이름으로 이름을 바꾸는 것입니다. 대부분의 플랫폼에서 소스와 대상이 동일한 파일 시스템 볼륨 인 경우 이름 바꾸기 작업은 원 자성입니다. 이름 변경은 다른 파일 확장자를 사용하거나 파일을 한 디렉토리에서 다른 디렉토리 (같은 볼륨에 있음)로 옮길 수도 있습니다.

이 경우 독점적으로 XML로 작업하기 때문에 닫기 태그를 찾는 것이 효과적 일 수 있지만 확실하지는 않습니다 — 최종 마크 업 이후에 주석이 있거나 작성자가 단순히 유효하지 않은 경우 XML?

EOF는 이 아니며 작품을 찾고 있습니다. 작성자가 파일을 방금 열었지만 아직 아무것도 작성하지 않은 경우에도 항상 EOF가 있습니다. 그렇지 않은 경우 가장 쉬운 방법은 파일이 표시되는 즉시 독자가 구문 분석을 시작할 수 있도록하는 것입니다. 그것은 단순히 작가가 파일을 닫을 때까지 차단 될 것입니다. 그러나 파일 시스템은 이런 식으로 작동하지 않습니다. 어떤 프로세스가 현재 그것을 옮기고있다하더라도 모든 파일은 끝이 있습니다.

1

내가 아는 한, 다른 프로세스가 현재 Java의 파일에 대한 열린 핸들을 가지고 있는지 확인할 방법이 없습니다. 하나의 옵션은 새로운 io에서 FileLock 클래스를 사용하는 것입니다. 이것은 모든 플랫폼에서 지원되는 것은 아니지만 파일이 로컬이고 파일 쓰기 프로세스가 협조하는 경우 잠금을 지원하는 모든 플랫폼에서 작동해야합니다.

4

또한 체크를 한 다음 쓰기를하면 경쟁 조건이 발생합니다. 상태는 수표와 기입간에 변경 될 수 있습니다. 때로는 노력하고 정상적으로 오류를 처리하는 것이 가장 좋습니다. 아마도 폴백 지연 시간이 증가한 n 시도 재시도 메커니즘 일 수 있습니다.

또는 테스트를 재정의하십시오. 이 경우 파일 크기가 일정 기간 동안 변경되지 않았 음을 테스트 한 후 처리 할 수 ​​있습니다.

또 다른 옵션은 코드를 두 개로 분할하는 것입니다. 다른 스레드 (예 : 석영 작업)는 완성 된 파일을 주 코드가 처리하는 다른 디렉토리로 이동시키는 역할을합니다.

0

리더 및 라이터를 모두 제어하는 ​​경우 잠재적 잠김 기술은 읽기 및 쓰기 프로세스 지속 시간 인 일반적으로 원자 작업 인 디렉토리의 디렉토리를 생성하는 것입니다. 이러한 유형의 접근법을 사용하면 프로세스의 잠재적 인 실패를 관리하여 "hanging"잠금 디렉토리를 만들어야합니다.

Cheekysoft에서 언급했듯이 파일은 원 자성이 아니며 잠금에 적합하지 않습니다.

예를 들어 FTP 데몬에서 작성하는 경우 라이터를 제어하지 않으면 이름 바꾸기 기술 또는 시간 범위 기술 지연이 가장 좋습니다.

2

Windows에서 작동하는 한 가지는 다음과 같습니다. - 전체 파일 이름을 사용하는 생성자를 사용하여 해당 파일을 나타내는 File() 개체를 만듭니다. - 같은 방식으로 두 번째 동일한 파일 개체를 만듭니다. - 시도 firstFile.renameTo (secondFile)

다른 연습 (내가 테스트 한 파일)에 의해 편집을 위해 열려 있지 않은 파일은이 더미 이름 바꾸기 연습이 성공하지만 열리는 경우 실패합니다.

nw filename = 이전 파일 이름으로는 다른 작업을 생성하지 않습니다.

+0

이 이름 바꾸기 트릭은 Windows에서만 작동합니다. 맞습니까? – Serxipc

관련 문제