2011-08-04 2 views
2

RESULTFOLDER 폴더를 지속적으로 폴링하고 새 파일이 있는지 확인하는 Java 스레드 A가 있습니다.
이제 파일은 다른 컴퓨터에서 실행중인 다른 프로그램에서 RESULTFOLDER에 게시됩니다. 게시 된 파일은 모든 xml 파일 (XML 만 가능)입니다. 언제든지 RESULTFOLDEr에서 xml 파일 만 저장할 수 있습니다.
내 스레드가 지속적으로 RESULTFOLDER를 폴링하고 XML 파일을 한 번에 하나씩 구문 분석 한 다음 삭제합니다.
때로는 스레드 A가 다른 프로그램이 파일 A를 게시하는 시점에 파일 A를 읽고 구문 분석하려고 시도하는 경우가 있습니다.이 경우 파일을 구문 분석하는 중에 예외가 발생합니다. 파일의 성숙이 완료되었습니다.
어떻게 문제를 해결할 수 있습니까?다른 스레드가 스레드를 생성 할 때 xml 파일을 구문 분석 할 때 파일 끝 조기 예외가 발생합니다

내가 생각하는 한 가지 방법은 파일 생성의 날짜 시간을 확인하고 파일이 적어도 1 분 정도는 presnt인지 확인하는 것입니다.하지만 자바가 그런 API를 제공한다고 생각하지 않습니다. 어떻게이 문제를 해결할 수 있습니까?

답변

3

.xml 파일을 폴더에 쓴 다음 그 후에 작성된 별도의 제어 파일을 쓸 수 있습니다. 제어 파일은 0 바이트를 가지며 .ctl과 같은 다른 확장자를 갖지만 이름의 첫 번째 부분은 같습니다.

결과 폴더를 폴링하는 스레드가 .ctl 파일을 찾으면 확장명이 .xml 인 동일한 이름의 파일을 여는 것이 안전하다는 것을 알고 있습니다.

이 접근 방식은 쓰기 작업이 다른 컴퓨터에있는 경우에도 작동한다는 이점이 있습니다.

1

생성시 파일에 setWritable (true, true) 및 setReadable (true, true) 호출을 생성하도록합니다. 이렇게하면 작성하지 않은 스레드가 작성중인 스레드에 의해 작성 될 때 해당 파일에 액세스하지 못하게됩니다. 파일 작성 후 setWritable (true, false) 및 setReadable (true, false). 폴링 스레드는 폴링 시간에 쓰기 권한을 검사하여 파일을 읽어야하는지 확인해야합니다.

또는 디렉토리에 뮤텍스를 제공 할 수 있습니다. 파일을 만드는 스레드가 디렉토리에 대한 뮤텍스를 가져 와서 파일을 만들고 채운 다음 뮤텍스를 릴리스하십시오. 폴링 스레드가 검사를 수행해야 할 때 뮤텍스를 잡고 디렉토리를 확인한 다음 파일을 처리 한 다음 뮤텍스를 릴리스합니다.

0

세 가지 방법 : 파일이 기록되는으로

  1. 입니다 이름 foo.tmp 있습니다. 완전히 쓰여지면 제작자가 으로 이름을 바꿉니다. 따라서 소비자가 is가 제작자에 의해 완전히 작성되기 전까지는 XML 파일을 볼 수 없습니다.

  2. (@aaaa bbbb와 같은 대답). 파일이 완전히 작성되면 foo.ctl이라는 이름의 다른 파일 (비어있을 수 있음)이 작성됩니다. 소비자는 CTL 파일을 볼 때까지 XML 파일을 처리하지 않습니다. 그 후에는 XML 파일을 모두 제거 할 수 있습니다.

  3. (@ tafoo85와 같은 대답). is는 is가 comlpetely 쓰여지고 제작자가 읽을 수있게 만들 때까지 파일을 읽을 수 없습니다. 생산자 스레드가 완료되지 않은 XML 파일을 작성의 중간에있는 동안 사망하는 경우에도

이러한 접근은 제대로 작동의 추가 혜택이있다.

+0

좋은 요약. 물론 나는 당신의 답을 가장 좋아합니다. 원격으로 복사 된 파일의 이름을 바꾸는 데 문제가있어서 제어 파일 방식을 선호합니다. –

관련 문제