2012-07-31 3 views
6

File 인스턴스를 만들지 않고 InputStream의 크기를 바이트 단위로 가져와야합니다. Java NIO를 사용하여이를 수행 할 수있는 방법이 있습니까?Java InputStream 크기

+2

왜 당신이 필요이 다음 링크를 확인받을 수 있나요? – Jeffrey

+3

'InputStream '의 계약은 그것이 유한하다는 것을 명령함에 관해서 아무 것도 말하지 않는다. – oldrinb

+1

또는 사전에 정의되어 있습니다. – EJP

답변

24

일반적으로 InputStream? 스트림이 끝날 때까지 읽은 바이트 수를 계산하여 읽고 계속 읽어야합니다 (예 : 같은 버퍼로, 반복해서).

물론 데이터 자체를 읽을 수는 없습니다. 원한다면 데이터를 읽은 상태로 유지해야합니다. ByteArrayOutputStream으로 복사하면됩니다.

(길이를 계산하는 것과 동시에 데이터를 처리 할 수 ​​있다면 루프를 사용하여 읽을 때마다 동일한 버퍼로 읽을 때마다 카운터를 증가시켜 기록하면됩니다. . 당신이 읽은 얼마나 당신은 정말 우리에게 당신이 스트림에 수행 할 작업에 대한 정보를 제공하지 않은 경우)

+1

또는 목적지로 복사하거나 카운트를 제거하고 ByteArrayOutputStream, 대기 시간 및 메모리를 모두 준비하여 낭비되는 공간을 제거하십시오. – EJP

+0

@EJP : 그것은 당신이 나중에 무엇을 할 것인가에 달려 있습니다. 목적지에 복사하지 않을 수도 있습니다. –

+0

그렇게하는 동안 읽은 다음 처리하십시오. 저는 입력이 매우 작다는 것을 알지 못한다면 전체 입력을 읽는 것으로 시작하는 '솔루션'에 대해 매우 의심 스럽습니다. 어떤 경우에 어떤 크기인지 전혀 알 필요가 없지 않습니까? – EJP

1

추가 옵션의 몇 :.

을의 차단 특성에 따라 입력 스트림 인 경우 스트림에서 available()으로 전화 할 수 있습니다.

스트림이 작다면 PushbackInputStream에 스트림을 기록하고 바이트를 계산 한 다음 되감기 할 수 있습니다.

+1

-1. available()은 스트림의 크기를 리턴하지 않고 * Javadoc에 그렇게 말하는 특정 경고가있다. 그리고 * 모든 입력 스트림이 차단되고 있습니다. – EJP

+6

모순됩니다. JavaDoc을 확인하십시오. http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#available%28%29. available()의 반환 값은 ** 블로킹없이 읽을 수있는 바이트 수 **임을 지정합니다. 또한 "경우에 따라 느린 네트워크에서 대용량 파일을 읽는 경우와 같이 단순히 차단할 때 비 차단 읽기 (또는 건너 뛰기)가 차단 된 것처럼 보일 수 있습니다. FileInputStreams의 경우에는 크기에 대한 신뢰할 수있는 지표가되는 경우가 많습니다. – Nicholas

+2

그건 정확히 내가 말한거야. 그것은 당신이 말한 것과 정반대입니다.available()을 사용하여이 질문의 주제 인 입력 스트림의 크기를 반환 할 수 있다고하셨습니다. 차단하지 않고 읽을 수있는 바이트 수와 같은 것은 아닙니다. 소켓을 고려하십시오. 'furthermore'이후의 부분에는 관련성이 없습니다. 마지막 문장에서 사용법에 대해 특별히 경고하는 인용 부호가없는 또 다른 문장이 있으며 FileInputStream에 대한 질문에는 아무 것도 없습니다. – EJP

6

원칙적으로 알지 못합니다 (작성을 중단하지 않는 동료를 생각해보십시오). 필요하지 않습니다. 고정 크기 버퍼를 사용하여 루프를 읽고 쓰십시오. NIO는 어떤 마법의 해결책도 제시하지 않습니다.

-2

당신은 Utils.java의의 InputStream 사용 getBytes (inputStream을)의 크기가

Get Bytes from Inputstream

+0

즉, 스트림의 끝까지 스트림을 읽거나, ByteArrayInputStream의 문서화되지 않은 속성에 의존하십시오. 품질이 매우 좋지 않은 링크이며 질문에 지정된 NIO를 사용하지 않습니다. -1 – EJP