문제

들어오는 XML 파일을위한 폴더를 모니터링하는 Java 응용 프로그램이 있습니다. 새 파일이 감지되면 파일이 현재 업데이트되지 않고 닫히는 파일을 테스트해야합니다. 내 생각은 사용하는 것입니다 file.canwrite () 이것을 테스트합니다. 이 작업에 문제가 있습니까? 파일이 완전히 작성되었음을 테스트하는 좋은 방법입니까?

내가 던지는 다른 아이디어는 다음과 같습니다.

  • 들어오는 XML 파일을 구문 분석하고 닫는 태그가있는 것을 테스트하십시오.
  • EOF 캐릭터를 확인하십시오.

이러한 방법 중 하나가 모든 시나리오를 처리 할 것이라고 확신하지 못합니다.

도움이 되었습니까?

해결책

아니요, CANWRITE는이 목적에 적합하지 않습니다. 일반적으로 다른 프로세스가 작성하더라도 파일은 쓸 수 있습니다.

잠금을 조정하려면 더 높은 레벨 프로토콜이 필요합니다. 단일 플랫폼 에서이 코드를 사용할 계획이라면 사용할 수 있습니다. Nio의 Filelock 시설. 그러나 문서를주의 깊게 읽고 많은 플랫폼에서 잠금은 권고 일뿐입니다.

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

이 경우 XML과 독점적으로 작업하고 있기 때문에 가까운 태그를 찾고 있지만 최종 마크 업 이후의 주석이 있거나 유효한 XML을 작성하지 않으면 어리석지 않습니다.

EOF Will을 찾고 있습니다 ~ 아니다 일하다. 작가가 방금 파일을 열고 아직 아무것도 쓰지 않은 경우에도 항상 EOF가있을 것입니다. 그렇지 않은 경우, 가장 쉬운 것은 파일이 나타나 자마자 독자가 구문 분석을 시작할 수 있도록하는 것입니다. 작가가 파일을 닫을 때까지 단순히 차단됩니다. 그러나 파일 시스템은 이런 식으로 작동하지 않습니다. 일부 프로세스가 현재 이동 중에도 모든 파일에는 종료가 있습니다.

다른 팁

또한 수표를 작성한 후 쓰기를하면 레이스 조건이 있습니다. 상태는 수표와 쓰기 사이에서 변경 될 수 있습니다. 때로는 원하는 것을 시도하고 수행하고 오류를 우아하게 처리하는 것이 가장 좋습니다. 아마도 폴백 지연 시간이 증가한 n- 평가 재 시도 메커니즘 일 것입니다.

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

또 다른 옵션은 코드를 두 개로 분할하는 것입니다. 기본 코드가 처리하는 다른 디렉토리로 완성 된 파일을 이동하는 다른 스레드 (아마도 석영 작업)가있을 수 있습니다.

Windows에서 작동하는 것 중 하나는 이것입니다 - 해당 파일을 나타내는 파일 () 객체를 작성합니다 (전체 파일 이름으로 생성자 사용) - 두 번째 동일한 파일 객체를 동일하게 만듭니다. - FirstFile.Renameto (SecondFile) 시도

이 더미 이름 변경 연습은 다른 앱에서 편집하기 위해 열려 있지 않은 파일 (Word로 테스트)으로 성공한 것으로 보이지만 열려있는 경우 실패합니다.

그리고 NW Filename = 이전 파일 이름으로 다른 작업을 만들지 않습니다.

내가 아는 한, 다른 프로세스에 현재 Java의 파일에 대한 열린 핸들이 있는지 알 수있는 방법이 없습니다. 한 가지 옵션은 Filelock 새로운 IO에서 수업. 이는 모든 플랫폼에서 지원되는 것은 아니지만 파일이 로컬이고 파일을 작성하는 프로세스가 협력하는 경우 이는 잠금을 지원하는 모든 플랫폼에서 작동해야합니다.

독자와 작가를 모두 제어하면 잠재적 잠금 기술은 잠금 장치를 만드는 것입니다. 예배 규칙서 - 이는 일반적으로 원자 연산입니다. 읽기 및 쓰기 프로세스 기간. 이러한 유형의 접근 방식을 취하면 프로세스의 잠재적 실패를 관리하여 "교수형"잠금 디렉토리를 만들어야합니다.

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

작가를 제어하지 않는 경우 (예 : FTP 데몬에 의해 제작되는 경우), 시간 범위 기술의 이름 바꾸기 기술 또는 지연이 최선의 옵션입니다.

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