2013-11-15 7 views
0

나는 (내가 Josh M에, here에서 학점을했다)pdf 파일과 non pdf 파일을 구별하는 방법은 무엇입니까?

public final class FileDownloader { 

    private FileDownloader(){} 

    public static void main(String args[]) throws IOException{ 
     download("http://pdfobject.com/pdf/sample.pdf", new File("sample.pdf")); 
    } 

    public static void download(final String url, final File destination) throws IOException { 
     final URLConnection connection = new URL(url).openConnection(); 
     connection.setConnectTimeout(60000); 
     connection.setReadTimeout(60000); 
     connection.addRequestProperty("User-Agent", "Mozilla/5.0"); 
     final FileOutputStream output = new FileOutputStream(destination, false); 
     final byte[] buffer = new byte[2048]; 
     int read; 
     final InputStream input = connection.getInputStream(); 
     while((read = input.read(buffer)) > -1) 
      output.write(buffer, 0, read); 
     output.flush(); 
     output.close(); 
     input.close(); 
    } 
} 

그것은 PDF 파일과 함께 완벽하게 작동 PDF 파일을 다운로드하려면 다음 코드를 사용했다. 그러나 "잘못된 파일"이 발견되어서 ... 그 파일의 확장자가 무엇인지 모르겠지만 while((read = input.read(buffer)) > -1)의 무한 루프에 빠진 것처럼 보입니다. 부적절한 파일 (비 pdfs)을 버리기 위해이 스 니펫을 개선하려면 어떻게해야합니까?

+0

* pdf 파일과 완벽하게 작동합니다. 그러나, "나쁜 파일"*을 만났을 때 - 이것이 정말로 PDF 또는 PDF의 문제인지 여부를 확인 했습니까? 이러한 상황에서 대상 파일의 내용을 확인 했습니까? – mkl

답변

2

비슷한 문제가있는 질문이 있습니다 : Infinite Loop in Input Stream.

가능한 해결책을 확인하십시오 : Abort loop after fixed time.

연결에 대한 시간 초과 설정을 시도 할 수 있습니다 : Java URLConnection Timeout.

+0

+1 감사합니다. 이 솔루션은 작은 볼륨에서도 좋습니다. 그러나 모든 다운로드마다 새 스레드를 시작하는 것은 비현실적입니다. 검사 할 파일이 약 3700 만 개 있습니다. –

+0

다른 가능한 해결책으로 답변을 업데이트했습니다. –