바이트 []를 InputStream 또는 OutputStream으로


129

내 데이터베이스 테이블에 Blob 열이 있는데 byte[]Java 프로그램에서 매핑으로 사용해야 하며이 데이터를 사용하려면 InputStream또는 로 변환해야합니다 OutputStream. 그러나 나는 그렇게 할 때 내부적으로 어떤 일이 일어나는지 모른다. 이 전환을 수행 할 때 어떤 일이 발생했는지 간략하게 설명 할 수 있습니까?


2
제목이 "bytes of array ..."또는 "byte array ..."또는 "byte [] ..."가 아니어야합니까?
kuester2000

답변:


198

다음과 같이 바이트 배열 I / O 스트림을 작성하고 사용합니다.

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

당신이 구현 표준하는 JDBC 드라이버를 사용한다고 가정하면 JDBC의 Blob 인터페이스 (모든 안)을 수행 할 수 있습니다 또한 를 연결 InputStream또는 OutputStream사용하여 BLOB에 getBinaryStreamsetBinaryStream방법 1을 , 그리고 당신도 얻고 직접 바이트를 설정할 수 있습니다.

(. 일반적으로, 폐쇄, 그러나 어떤 예외 및 가까운 스트림을 처리하기 위해 적절한 조치를 취해야 bis하고 bos그들이 외부의 자원과 관련되지 않기 때문에 위의 예에서, 불필요하다, 예를 들어, 파일 설명, 소켓, 데이터베이스 연결을.)

1-이 setBinaryStream방법은 실제로 게터입니다. 그림을 이동.


13

나는 당신이 '사용'이 독서를 의미한다는 것을 의미한다고 가정하지만, 읽기 사례에 대해 설명 할 것은 기본적으로 쓰기 사례에 대해 뒤집을 수 있습니다.

그래서 당신은 byte []로 끝납니다. 이는 특수한 유형의 변환 (문자, 암호화 등)이 필요할 수있는 모든 종류의 데이터를 나타낼 수 있습니다. 이 데이터를 그대로 파일에 쓰려고한다고 가정 해 봅시다.

먼저 ByteArrayInputStream을 만들 수 있습니다 기본적으로 바이트를 순서대로 무언가에 공급하는 메커니즘 인 을 .

그런 다음 FileOutputStream을 만들 수 있습니다 는 파일 을 만들 수 있습니다. 서로 다른 데이터 소스 및 대상에 대한 많은 유형의 InputStream 및 OutputStream이 있습니다.

마지막으로 InputStream을 OutputStream에 씁니다. 이 경우 바이트 배열은 순차적으로 FileOutputStream에 전송되어 작성됩니다. 이를 위해 IOUtils를 사용하는 것이 좋습니다.

byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);

그리고 반대로

FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();

위의 코드 스 니펫을 사용하는 경우 예외를 처리해야하며 finally 블록에서 '닫기'를 수행하는 것이 좋습니다.


당신은 의미하지 않았다-ByteArrayOutputStream out = new ByteArrayOutputStream (); 대신 ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano

CloseQuietly는 finally 절에 있어야합니다.
JustinKSU


4

InputStream / OutputStream과 작업중인 바이트간에 변환이 없습니다. 그것들은 이진 데이터를 위해 만들어졌으며 그대로 바이트를 하나씩 읽거나 씁니다.

바이트에서 문자로 이동하려면 변환이 필요합니다. 그런 다음 문자 집합을 사용하여 변환해야합니다. 이것은 문자 데이터를 위해 바이트 또는 바이트로 문자열 또는 리더를 만들 때 발생합니다.


1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )


0
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

응답 객체에 기존 OutputStream이 이미 있기 때문에 이것이 더 낫다고 생각합니다. 새로운 OutputStream을 만들 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.