Byte []からInputStreamまたはOutputStream


129

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


2
タイトルは、「バイトの配列...」または「バイトの配列...」または「byte [] ...」の「バイトの配列...」ではありませんか?
kuester2000

1
逆こちらをご覧ください:stackoverflow.com/questions/1264709/...
ジェイ・テイラー

回答:


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使用してブロブにgetBinaryStreamsetBinaryStream方法1を、そしてあなたも取得し、直接バイトに設定することができます。

(一般的に、あなたは閉じて、しかしすべての例外、およびcloseストリームを処理するための適切な措置を講じなければならないbisし、bos彼らは任意の外部リソースに関連付けられていないので、上記の例では、不要である;例えば、ファイルディスクリプタ、ソケット、データベース接続を。)

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


13

「使用」は読み取りを意味すると思いますが、読み取りの場合について説明する内容は、基本的に書き込みの場合と逆にすることができます。

したがって、最終的にはbyte []に​​なります。これは、特殊なタイプの変換(文字、暗号化など)を必要とする可能性があるあらゆる種類のデータを表すことができます。このデータをそのままファイルに書き込みたいとしましょう。

最初に、基本的にバイトを順番に何かに供給するメカニズムであるByteArrayInputStreamを作成できます。

次に、作成するファイルのFileOutputStreamを作成できます。さまざまなデータソースと宛先に対応する多くのタイプのInputStreamsとOutputStreamsがあります。

最後に、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();
アビハイマルチャーノ

CloseQuietlyは、おそらくfinally節にあるはずです。
JustinKSU 2014


4

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

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


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.