web-dev-qa-db-ja.com

Byte []からInputStreamまたはOutputStream

データベーステーブルにblob列があり、Javaプログラムでbyte[]をマッピングとして使用し、このデータを使用するには、InputStreamまたはOutputStreamに変換する必要があります。しかし、そうすることで内部的に何が起こるかわかりません。この変換を行ったときに何が起こっているのか簡単に説明できますか?

122
GuruKulki

次のように、バイト配列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インターフェース (すべてではない)を実装するJDBCドライバーを使用していると仮定すると、also接続できますInputStreamおよびOutputStreamメソッドを使用して、getBinaryStreamまたはsetBinaryStreamをblobに1、バイトを直接取得および設定することもできます。

(一般に、例外を処理してストリームを閉じるには適切な手順を踏む必要があります。ただし、上記の例でbisおよびbosを閉じることは、外部リソース(ファイル記述子、ソケット、データベース接続など) )

1-setBinaryStreamメソッドは実際にはゲッターです。図を移動します。

190
Stephen C

私はあなたが「使用」が読み取りを意味することを意味すると仮定していますが、読み取りケースについて説明することは、書き込みケースについては基本的に逆にすることができます。

したがって、最終的に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ブロックで 'closes'を実行することをお勧めします。

12
pstanton

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

6
12cram

InputStream/OutputStreamと、それらが使用しているバイトの間の変換はありません。これらはバイナリデータ用に作成されており、バイトを1つずつそのまま読み取り(または書き込み)します。

バイトから文字に移動する場合は、変換が必要です。次に、文字セットを使用して変換する必要があります。これは、文字データ用に作成されたバイトから文字列またはリーダーを作成するときに発生します。

4
Thilo
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
2
DALDEI

私の答えはこの質問にかなり遅れていることはわかっていますが、コミュニティは この問題に対する新しいアプローチ を望んでいると思います。

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

応答オブジェクトに既存のOutputStreamがあるため、これはより良いと思います。新しいOutputStreamを作成する必要はありません。

0