ByteBuffer
を使用する場所のタイプは、通常、バイト配列(固定サイズもあります)を使用する場所の種類です。同期I/Oでは、バイト配列を非同期I/Oで使用することがよくありますが、ByteBuffersが代わりに使用されます。
あなたは、ByteBuffer
を使用してデータの未知の量を読んで、あなたの緩衝液でループの使用を検討し、あなたがそれを読むようByteArrayOutputStreamにデータを追加する必要がある場合。終了したら、toByteArray()
に電話して、最後のバイト配列を取得します。
入力のサイズ(または最大サイズ)が絶対にわからない場合は、ループで読み込みます(おそらくByteArrayOutputStream
を使用しますが、それ以外の場合はストリームとして処理します)。 )これを処理する唯一の方法です。何らかのループがなければ、残りのデータはもちろん失われます。例えば
:あなたの代わりにJavaのint
S、または生のバイトではない他のものを書きたい場合は
final byte[] buf = new byte[4096];
int numRead;
// Use try-with-resources to auto-close streams.
try(
final FileInputStream fis = new FileInputStream(...);
final ByteArrayOutputStream baos = new ByteArrayOutputStream()
) {
while ((numRead = fis.read(buf)) > 0) {
baos.write(buf, 0, numRead);
}
final byte[] allBytes = baos.toByteArray();
// Do something with the data.
}
catch(final Exception e) {
// Do something on failure...
}
、あなたがDataOutputStream
であなたのByteArrayOutputStream
をラップすることができます
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
while (thereAreMoreIntsFromSomewhere()) {
int someInt = getIntFromSomewhere();
dos.writeInt(someInt);
}
byte[] allBytes = baos.toByteArray();
' StringBuffer'は動作が異なります。 'ByteBuffer'は、さらに追加しようとすると' BufferOverflowException'をスローします。 – bvdb