2010-06-17 8 views
7

Java 서블릿에서 HttpServletRequest를 가져 와서 모든 NIO를 사용하여 파일에 쓰는 방법 (전체 Inputstream을 버퍼링하지 않음)이 있습니까? 노력할만한 가치가 있습니까? 정상적인 java.io 스트림을 읽고 java.nio 채널에 쓰는 것이 더 빠를 수 있습니까? 아니면 둘 다 순수한 NIO 일 필요가 있습니까? 감사.Java NIO 서블릿 파일

는 편집 :

그래서 난 그냥 하나 개의 디스크에서 파일을 읽고 (그래서 실제로 코드가 아닌 디스크를 테스트하고 있습니다) 다른 디스크에 쓰기, 신속하고 더러운 벤치 마크를했다.

Averages: 
InputStream -> OutputStream : 321 ms. 
FileChannel -> FileChannel : 3 ms. 
InputStream -> FileChannel : 600 ms. 

실제로 하이브리드 java.io -> java.nio를 사용하려고하면 성능이 저하됩니다. nio-> nio는 A LOT보다 빠르지 만 Servlet InputStream이 붙어 있습니다.

답변

6

순수 NIO 솔루션의 주요 이점은 커널에서 사용자로 데이터를 복사하지 않고 커널 공간으로 돌아갈 수 있다는 것입니다. transferTo() 또는 transferFrom() 작업을 사용하면이 오버 헤드를 피할 수 있으며 채널 간 전송 속도가 매우 빨라질 수 있습니다 (기본 구현에 따라 다름).

그러나 Servlet API를 사용하면 소스 Channel에 액세스 할 수 없습니다. 서블릿에서 데이터를 볼 때까지 사용자 공간에 있습니다. 따라서 쓰기에서 성능 향상이 Channel으로 기대되지 않습니다.

1

HttpServletRequest는 일반적인 "풀"입력 스트림을 제공합니다. NIO를 사용하여 어떻게 여기에서 도움이되는지는 알 수 없습니다.

+0

FileChannel이 DMA를 사용하여 디스크에 스트림을 쓸 수 있다는 점을 제외하고는 성능이 향상 될 수 있다는 느낌이었습니다. – Gandalf

0

나는 아무것도 걱정하지 않는다고 생각합니다. 평균 네트워크 속도 (~ 1MB/s)는 평균 하드 디스크 속도 (~ 100MB/s)를 따라 잡을 수 없습니다 (심지어 가장 낙관적 평균이더라도). 파일 채널은 어떤 이점도주지 않습니다. "레거시"java.io은 충분합니다.

1

성능을 테스트 기간과 밀접하게 비교할 수는 없습니다.

API를 선택하면 디스크가 더 빨리 회전하지 않습니다. FileChannel-> FileChannel에서 발생한 일은 실제로 디스크에 기록 된 쓰기 전에 호출이 반환 된 것일 수 있습니다.

nio 일부 CPU/메모리 사용을 절약 할 수 있습니다. 그러나 당신의 상황에는 그리 많지 않습니다. 사용자가 업로드 한 파일을 저장하는 데 일반적으로 multipart/form-data 형식이며 서버는 입력을 구문 분석하고 파일 내용을 추출하기 위해 바이트 단위로 스트림을 읽어야하며 원시 스트림을 파일로 직접 덤프 할 수 없습니다.

관련 문제