您将使用的ByteBuffer
位置类型通常是您将使用字节数组(也具有固定大小)的位置类型。对于同步 I/O,您经常使用字节数组,而对于异步 I/O,则使用 ByteBuffers。
如果您需要使用 读取未知数量的数据ByteBuffer
,请考虑在缓冲区中使用循环,并在读取数据时将数据附加到ByteArrayOutputStream。完成后,调用toByteArray()
以获取最终的字节数组。
任何时候,当您不确定给定输入的大小(或最大大小)时,循环读取(可能使用 a ByteArrayOutputStream
,否则只是将数据作为流处理,因为它被读取)是唯一的方法来处理它。如果没有某种循环,任何剩余的数据当然都会丢失。
例如:
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...
}
如果您想编写 Javaint
或其他不是原始字节的东西,您可以将您的内容包装ByteArrayOutputStream
在 a 中DataOutputStream
:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
while (thereAreMoreIntsFromSomewhere()) {
int someInt = getIntFromSomewhere();
dos.writeInt(someInt);
}
byte[] allBytes = baos.toByteArray();