2012-07-18 4 views
0

지속적으로 업데이트되는 매우 큰 파일에서 작은 데이터 하위 집합을 플로팅하는 처리 스크립트가 있습니다. 데이터는 사용자 입력에 따라 무작위로 액세스됩니다. 따라서 전체 파일을 메모리에로드하지 않고도 속도를 높이려면 파일을 ByteBuffer로 메모리 매핑해야합니다. 이것은 로컬 컴퓨터에서 실행될 때 예외적으로 잘 작동하지만 불행하게도 프로젝트의 최종 목표는 웹 애플릿입니다. 애플릿 내에서 액세스되는 파일로부터 메모리 맵핑 또는 랜덤 액세스 파일 구조를 생성하는 좋은 방법이 있습니까? URL.openStream()을 많이 보았지만 InputStream을 내가 필요한 것으로 변환하는 방법을 알지 못했습니다. 여기에 내가 오프라인 앱했다 무엇 : 애플릿에서 온라인으로 호스팅되는 랜덤 액세스 또는 메모리 매핑 된 파일을로드하는 방법

//within my GraphicPlot class: 

ByteBuffer bbuf; 
FileChannel fc; 

SetUpPlot(String fileName){  
    try { 
    FileInputStream instream = new FileInputStream(fileName); 
    fc = instream.getChannel(); 
    bbuf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
    } 
    catch (IOException e) { 
    e.printStackTrace(); 
    exit(); 
    } 
} 

은 아무리 기능 (절대 URL, 상대 URL 등)에 URL을 보낼 어떻게 오류를 찾을 수 없습니다 파일을 얻을 수 없습니다.

도움이 될 것입니다.

EDIT : 애플릿이 서명되고 해당 파일이 애플릿과 동일한 디렉토리에 호스팅되므로 애플릿 사용 권한 문제가 없어야 함을 언급해야합니다.

답변

0

FileInputStream 및 메모리 매핑은 로컬 시스템의 파일에서만 작동합니다. http 또는 다른 프로토콜을 통해서만 사용할 수있는 파일을 메모리 맵핑 할 수 없습니다. FileInputStream 또는 메모리 매핑을 사용하려면 먼저 로컬 시스템에서 복사본을 가져와야합니다.

이것은 Java의 제한 사항이 아니며 운영 체제의 제한 사항입니다.

+0

응답 해 주셔서 감사합니다. 이것이 내가 두려워하거나 추측 한 것입니다. 프로토콜 제공 파일에 임의로 액세스하는 방법에 대한 권장 사항이 있습니까? 나는 mark(), reset() 및 skip()의 조합을 사용하여 InputStream에서 seek()를 구현하는 것을 고려하고 있지만 대부분의 시간이 바이트를 낭비하는 데 소비되기 때문에 너무 느린 것처럼 보입니다. 원하는 영역으로 이동하십시오 ... – mrosasco

+0

오프셋 및 크기를 지정할 수있는 http 클라이언트에서이 작업을 수행 할 수 있어야합니다. 일부 HTTP 서버는 파일의로드 부분을 지원합니다. –