2012-05-17 2 views
0

저는 Java 전문가는 아니지만 프로그램에서 높은 처리량을 처리 할 것입니다. 그래서 나는 의견을 소싱하는 군중을 조금씩 할 것이라고 생각했습니다. 여기 상황이 있습니다.Java에서 일치하는 파일을 확인하는 효율적인 방법

java 프로세스가 처리 할 파일의 디렉토리를보고 있으면이 파일이 쌍을 이룹니다 (저장할 데이터 파일과 카탈로그화할 메타 정보가있는 XML 파일). 따라서 현재 파일 목록을 가져 와서 필요한 쌍둥이를 확인한 다음 처리해야합니다.

파일의 파일 이름은 항상 일치하며 파일 확장명 만 다릅니다. 예 : filename1.jpg filename1.xml filename2.jpg 나는 세 가지 옵션이 지금까지 생각했다가

filename2.xml.

  1. File.List (FileNamefilter)와

    사용 FilenameFilter 파일 이름과 전체 파일이 .XML와없는 파일 목록을 생성하기 위해 1보다 큰

  2. 사용이 filenamefilters 인 경우 확인을 위해 전화 .xml, 비 XML 파일 목록을 ArrayList로 변환하고 Collections.binarySearch()를 호출하십시오.

  3. .xml 확장명없이 모든 파일의 목록을 생성하고이 목록을 파일 이름을 기준으로 .xml 파일을 사용하는 키/값 쌍의 해시 맵 키로 사용하십시오. 그런 다음 해시 목록을 실행하고 처리하기 전에 .xml 트윈이 있는지 확인하십시오.

의견이 있으십니까?

편집은/지금이 FilenameFilters, XML 파일과하지 않는 하나를 나열 하나를 사용하여 진행을위한 해요 제안과 땜질보고 후

댓글. XML 파일 목록에서 xml 확장자가 제거되고 해시에 덤프됩니다. 그런 다음 데이터 파일 목록을 반복하고, hashlist.contains()를 호출하여 계속 진행하기 전에 해시 세트에 일치하는 항목이 있는지 확인합니다.

불완전한 파일 처리와 관련하여 아래에 언급 된 것과 같은 우려 사항이 있습니다. 나는이 의견에 말했듯이 그 쓰기 (새 파일, 편집을 위해 열 수 없습니다)

답변

3

모든 파일을 가져 오기 완료 될 때까지, 나는 종류 그 다음 실행, 새로 작성된 파일이 아닌 쓰기 프로세스에 보이지 않는 가정 파일 이름에 대한 선형 패스 및 접두사에 동의하는 것을 확인합니다. 분명히 정렬 된 목록에서 서로 옆에 와야합니다.

필터와 해시 맵보다 훨씬 간단하고 빠릅니다.

디렉토리를 모니터링하려면 사용 가능한 경우 inotify와 같은 알림 기본 API를 사용하는 것이 좋습니다. 그런 다음 폴더 내용이 변경되면 OS가 신호를 보냅니다.

+0

+1 : 명백한 해결책이 내 것보다 낫습니다. –

0

이것은 약간 주제가 아니지만, 의도가 명시된대로 여기에 게시하는 것이 적절할 것으로 기대합니다.

질문은 파일이 디렉토리에 도착하는 방식을 나타내지 않습니다. 네트워크 또는 인터넷을 통해 들어 오거나 다른 프로세스에서 스트리밍되는 경우 즉시 제공되는 것보다 적을 수 있으므로 아직 완전히 전달되지 않은 파일을 선택하고 처리 할 위험이 있습니다. jpeg 파일의 절반.

처리량이 많은 경우 허용하면 허용되는 상황입니다. 처리하기 전에 잠시 지연하더라도 여전히 조만간 발생할 수 있습니다.

이 문제를 해결하기위한 일반적인 전략은 중간 파일 이름 (또는 더 나은 여전히 ​​인접한 폴더)으로 전달하는 것입니다. 배달이 완료되면 전달 프로세스에서 파일의 이름과 위치를 변경하거나 이름을 바꿉니다. 이 이동은 실제로 즉시 (원자)입니다. ftp의 경우 적어도 하나의 잘 알려진 도구가이 단계를 자동으로 수행합니다.

부분적으로 제공되는 파일이 대체 파일 확장명으로 이름이 변경된 동일한 폴더에있는 경우이 질문에 언급 된 일부 옵션에 영향을 미칠 수 있습니다.

+0

필자는이 파일들이 새롭게 쓰여지고 있기 때문에 OS는 쓰기가 완료 될 때까지 기존 파일을 보여주지 않을 것이라는 가정하에있었습니다. 디렉토리의 새 파일에서 복사/쓰기가 수행되는 동안 해당 쓰기를 수행하지 않는 모든 프로세스는 디렉토리에 현재 파일을 쿼리 할 때이를 볼 수 없습니다. 틀 렸으면 고쳐줘. – FaultyJuggler

+0

실제로 내가 아는 모든 OS는 파일을 만들 때 표시하기 시작합니다. 닫힌 상태 (작성 완료)가 아닌 파일을 표시하기 시작합니다. 그래서 임시 파일 (또는 임시 폴더)에 작성한 다음 완료되면 파일을 최종 이름으로 이동하는 것이 가장 좋은 방법입니다. –

관련 문제