2010-01-19 2 views
106

내 데이터베이스 테이블에 BLOB 열이 있습니다. 내 Java 프로그램에 byte[]을 매핑으로 사용하고이 데이터를 InputStream 또는 OutputStream으로 변환해야합니다. 그러나 그렇게 할 때 내부적으로 어떤 일이 발생하는지 알지 못합니다. 이 변환을 할 때 일어나는 일에 대해 간단히 설명 할 수 있습니까?Byte [] to InputStream 또는 OutputStream

+2

확인하세요 전체 예를 들어이 InputStream

String str = "Welcome to awesome Java World"; byte[] content = str.getBytes(); int size = content.length; InputStream is = null; byte[] b = new byte[size]; is = new ByteArrayInputStream(content); 

를 사용하여 입력 스트림에 바이트 [] 배열을 변환 할 수 있습니다 ... "또는"바이트 배열 ... "또는"바이트 [] ... ""바이트 배열 ... "instaed? – kuester2000

+1

여기에 반대를 참조하십시오 : http://stackoverflow.com/questions/1264709/convert-inputstream-to-byte-in-java –

답변

167

을 작성하고 다음과 같이 사용 바이트 배열 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 Blob interface (안 모두 않음), 당신은 에 연결할 수 있습니다 구현하는 JDBC 드라이버를 사용한다고 가정하면 getBinaryStreamsetBinaryStream 방법 을 사용하여 blob에 또는 OutputStream을 입력하고 직접 바이트를 가져오고 설정할 수도 있습니다.

(일반적으로 예외를 처리하고 스트림을 닫으려면 적절한 조치를 취해야합니다. 그러나 위의 예에서 bisbos을 닫는 것은 외부 리소스와 관련이 없으므로 불필요합니다. 예 : 파일 설명자, 소켓, 데이터베이스 연결).

1 - setBinaryStream 메서드는 실제로 getter입니다. 그림을 이동.

+1

좋은 .. 매우 도움이 –

4

InputStream/OutputStream과 작업중인 바이트 사이에는 변환이 없습니다. 그것들은 바이너리 데이터를 위해 만들어지고 바이트를 하나씩 읽는다.

byte에서 char로 이동하려면 변환이 필요합니다. 그런 다음 문자 집합을 사용하여 변환해야합니다. 이것은 문자 데이터 용으로 만들어진 바이트에서 String 또는 Reader를 만들 때 발생합니다.

+0

+1 - 나는 그 질문에 그 부분에 대답하려고했는데, 하지만 바빴어 :-) –

12

'사용'은 읽음을 의미한다고 가정하고 있지만, 읽은 경우에 대해 설명 할 내용은 기본적으로 쓰기 경우에 대해 되돌릴 수 있습니다.

그래서 바이트 []로 끝납니다. 이것은 특수한 유형의 변환 (문자, 암호화 등)이 필요한 모든 종류의 데이터를 나타낼 수 있습니다. 이 데이터를 그대로 파일에 쓰고 싶다.

기본적으로 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); 

과에서를 사용하는 것이 좋습니다 위의 코드 조각을 사용하는 경우는 예외를 처리해야하고 난 당신이 (가) finally 블록에 '종료'않는 것이 좋습니다

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

역 .

+0

당신이 의미하지 않았다 - ByteArrayOutputStream out = new ByteArrayOutputStream(); 대신 ByteArrayOutputStream out = new ByteArrayInputStream(); –

+0

예 oops ....... – pstanton

+0

CloseQuietly는 아마도 finally 절에 있어야합니다. – JustinKSU

0

나는 내 대답이이 질문에 대해 늦다는 것을 알고 있지만 지역 사회가 a newer approach to this issue을 좋아할 것이라고 생각합니다.

+0

원형 버퍼는 OP 문제를 해결하지 못합니다. 서면으로 작성된 질문에서 OP는 * 전체 * 내용을 단일 바이트 배열로 필요로합니다. –

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

응답 개체에 이미 기존 OutputStream이 있으므로이 방법이 더 좋습니다. 새 OutputStream을 만들 필요가 없습니다.

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