내 데이터베이스 테이블에 Blob 열이 있는데 byte[]
Java 프로그램에서 매핑으로 사용해야 하며이 데이터를 사용하려면 InputStream
또는 로 변환해야합니다 OutputStream
. 그러나 나는 그렇게 할 때 내부적으로 어떤 일이 일어나는지 모른다. 이 전환을 수행 할 때 어떤 일이 발생했는지 간략하게 설명 할 수 있습니까?
내 데이터베이스 테이블에 Blob 열이 있는데 byte[]
Java 프로그램에서 매핑으로 사용해야 하며이 데이터를 사용하려면 InputStream
또는 로 변환해야합니다 OutputStream
. 그러나 나는 그렇게 할 때 내부적으로 어떤 일이 일어나는지 모른다. 이 전환을 수행 할 때 어떤 일이 발생했는지 간략하게 설명 할 수 있습니까?
답변:
다음과 같이 바이트 배열 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에 getBinaryStream
와 setBinaryStream
방법 1을 , 그리고 당신도 얻고 직접 바이트를 설정할 수 있습니다.
(. 일반적으로, 폐쇄, 그러나 어떤 예외 및 가까운 스트림을 처리하기 위해 적절한 조치를 취해야 bis
하고 bos
그들이 외부의 자원과 관련되지 않기 때문에 위의 예에서, 불필요하다, 예를 들어, 파일 설명, 소켓, 데이터베이스 연결을.)
1-이 setBinaryStream
방법은 실제로 게터입니다. 그림을 이동.
나는 당신이 '사용'이 독서를 의미한다는 것을 의미한다고 가정하지만, 읽기 사례에 대해 설명 할 것은 기본적으로 쓰기 사례에 대해 뒤집을 수 있습니다.
그래서 당신은 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 블록에서 '닫기'를 수행하는 것이 좋습니다.
ByteArrayInputStream을 사용하여 byte [] 배열을 입력 스트림으로 변환 할 수 있습니다
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);
전체 예를 보려면 여기를 확인하십시오 http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html
나는이 질문에 대한 답변이 늦었다는 것을 알고 있지만 커뮤니티 가이 문제에 대한 새로운 접근 방식을 원한다고 생각합니다 .
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();
응답 객체에 기존 OutputStream이 이미 있기 때문에 이것이 더 낫다고 생각합니다. 새로운 OutputStream을 만들 필요가 없습니다.