[java] Java에서 InputStream을 바이트 배열로 변환

InputStream바이트 배열로 전체 를 어떻게 읽 습니까?



답변

Apache Commons IO 를 사용 하여 이와 유사한 작업을 처리 할 수 있습니다 .

IOUtils유형은을 읽을 수있는 정적 메소드가 InputStream와를 반환을 byte[].

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

내부적으로 이것은 a를 생성 ByteArrayOutputStream하고 바이트를 출력에 복사 한 다음을 호출합니다 toByteArray(). 4KiB의 블록으로 바이트를 복사하여 큰 파일을 처리합니다.


답변

에서 각 바이트를 읽고에 InputStream씁니다 ByteArrayOutputStream.

그런 다음 다음을 호출하여 기본 바이트 배열을 검색 할 수 있습니다 toByteArray().

InputStream is = ...
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

return buffer.toByteArray();


답변

마지막으로, 20 년 후 Java 9 덕분에 써드 파티 라이브러리가 필요없는 간단한 솔루션이 있습니다 .

InputStream is;

byte[] array = is.readAllBytes();

편리한 방법 readNBytes(byte[] b, int off, int len)transferTo(OutputStream)반복되는 요구 사항을 해결하십시오.


답변

바닐라 자바 DataInputStream와 그 readFully방법을 사용하십시오 (적어도 Java 1.4부터 존재합니다).

...
byte[] bytes = new byte[(int) file.length()];
DataInputStream dis = new DataInputStream(new FileInputStream(file));
dis.readFully(bytes);
...

이 방법에는 다른 맛이 있지만이 사용 사례에는 항상 이것을 사용합니다.


답변

google guava 를 사용하면 다음 과 같이 간단합니다.

byte[] bytes = ByteStreams.toByteArray(inputStream);


답변

항상 그렇듯이 Spring 프레임 워크 (3.2.2 이후의 스프링 코어)에는 다음과 같은 것이 있습니다.StreamUtils.copyToByteArray()


답변

public static byte[] getBytesFromInputStream(InputStream is) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    byte[] buffer = new byte[0xFFFF];
    for (int len = is.read(buffer); len != -1; len = is.read(buffer)) {
        os.write(buffer, 0, len);
    }
    return os.toByteArray();
}