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