データベーステーブルにblob列があり、Javaプログラムでマッピングとして使用する必要があります。このデータを使用するには、またはbyte[]
に変換する必要があります。しかし、そうすると内部で何が起こるのかわかりません。この変換を行うと何が起こっているのか簡単に説明できますか?InputStream
OutputStream
7 に答える
次のように、バイト配列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();
標準のJDBCBlobインターフェイスを実装するJDBCドライバーを使用していると仮定すると(すべてではありません)、メソッド1を使用してまたはをblobに接続することもできます。また、バイトを直接取得および設定することもできます。InputStream
OutputStream
getBinaryStream
setBinaryStream
(通常、例外を処理し、ストリームを閉じるには、適切な手順を実行する必要があります。ただし、bis
上記bos
の例では、ファイル記述子、ソケット、データベース接続などの外部リソースに関連付けられていないため、閉じる必要はありません。)
1-setBinaryStream
メソッドは実際にはゲッターです。図に行きます。
'use'は読み取りを意味すると思いますが、読み取りの場合について説明する内容は、基本的に書き込みの場合と逆にすることができます。
したがって、最終的には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ブロックで「closes」を実行することをお勧めします。
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
InputStream/OutputStreamとそれらが処理しているバイトの間の変換はありません。これらはバイナリデータ用に作成されており、バイトを1つずつそのまま読み取る(または書き込む)だけです。
バイトから文字に移動する場合は、変換を行う必要があります。次に、文字セットを使用して変換する必要があります。これは、文字データ用に作成されたバイトから文字列またはリーダーを作成するときに発生します。
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
私の答えはこの質問にはかなり遅れていることを私は理解していますが、コミュニティはこの問題へのより新しいアプローチを望んでいると思います。
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();
応答オブジェクトに既存のOutputStreamがあるので、これはより良いと思います。新しいOutputStreamを作成する必要はありません。