2012-04-16 3 views
2

웹 응용 프로그램에서 사용자가 Excel/CSV 형식으로 보고서를 다운로드 할 수있는 기능을 제공해야합니다. 일단 내가 만든 웹 응용 프로그램에서 모듈을 만든 다음 그것을 읽고 브라우저로 보냈습니다. 그것은 올바르게 작동했다. 이번에는 파일 시스템에 대한 제어 수준이 없기 때문에 Excel 파일을 생성하고 싶지 않습니다. 한 가지 방법은 StringBuffer에서 적절한 코드를 생성하고 올바른 contenttype을 설정하는 것입니다 (이 방법에 대해서는 확실하지 않습니다). 다른 팀도이 기능을 가지고 있지만 데이터가 매우 클 때 어려움을 겪고 있습니다. 데이터 크기를 고려할 때이 기능을 제공하는 가장 좋은 방법은 매우 클 수 있습니다. 클라이언트가 알아 차리지 않고 청크로 데이터를 보낼 수 있습니까 (다운로드 지연 제외). 내가 추가하는 것을 잊어 버리는 한 가지 문제는 매우 큰 데이터가있을 때, 또한 서버 측 (CPU 사용 및 메모리 소비)에 문제를 생성한다는 것입니다. 500과 같은 일정량의 레코드를 읽고 고객에게 보낸 다음 완료 될 때까지 또 다른 500을 읽을 수 있습니까?자바를 사용하여 큰 csv 파일을 효율적으로 다운로드하는 방법

답변

2

또한 CSV 대신 HTML을 생성하고 콘텐츠 형식을 Excel로 설정할 수도 있습니다. 이것은 채색 및 스타일이 지정된 텍스트에 좋습니다.

클라이언트가 압축을 허용하면 gzip 압축을 사용할 수도 있습니다. 일반적으로 서블릿 필터와 같은 표준 방법이 있습니다.

결코 StringBuffer 또는 더 나은 StringBuilder. 더 나은 스트리밍. setContentength를 호출 할 수 없으면 (예측할 수 없음) 출력이 청크 분할됩니다.

+0

설명해 주실 수 있습니까? 결코 StringBuffer 또는 더 나은 StringBuilder. 더 나은 스트리밍. – dmay

+0

StringBuffer가 (불필요한) 동기화를 가지고 있기 때문에 StringBuffer는 이후 StringBuilder보다 성능이 떨어집니다. 그리고 물론 StringB *에서 많은 것을 먼저 수집하고 그것을 스트리밍하고 싶지는 않습니다. 이를 스트리밍하는 파이프 라인이 훨씬 효율적입니다. 특히 다중 사용자 시나리오의 경우 더욱 그렇습니다. –

+0

약 1000 개의 레코드에 대한 데이터베이스를 쿼리 한 다음 클라이언트에게 보내고 다음 배치를 가져옵니다. 이것은 나의 기억 발자취를 대단히 감소시킨다. 나는 프로파일 러에서 메모리를 테스트하고 확인했으며 정상적으로 작동합니다. 이제는 내 응용 프로그램이 많은 메모리를 사용하지 않습니다. 프로파일 러에서 메모리 사용이 위험 수준에 도달 할 때마다 가비지 수집됨을 알 수 있습니다. – dmay

0
URL url = new URL("http://localhost:8080/Works/images/address.csv"); 

       response.setHeader("Content-Type", "text/csv"); 
       response.setHeader("Content-disposition", "attachment;filename=myFile.csv"); 

       URLConnection connection = url.openConnection(); 
       InputStream stream = connection.getInputStream(); 

       BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream()); 
       int len; 
        byte[] buf = new byte[1024]; 
        while ((len = stream.read(buf)) > 0) { 
         outs.write(buf, 0, len); 
        } 
        outs.close(); 
관련 문제