假设你正在处理一个 Activity,
private ByteBuffer getByteBuffer(Uri uri){
try{
InputStream iStream = getContentResolver().openInputStream(uri);
if(iStream!=null){
//value of MAX_SIZE is up to your requirement
final int MAX_SIZE = 5000000;
byte[] byteArr = new byte[MAX_SIZE];
int arrSize = 0;
while(true){
int value = iStream.read(byteArr);
if(value == -1){
break;
}else{
arrSize += value;
}
}
iStream.close();
return ByteBuffer.wrap(byteArr, 0, arrSize);
}
}catch(IOException e){
//do something
}
return null;
}
注意事项:
(i)InputStream.read(byte[] b) 将返回一个整数,表示每次读入字节数组b 的总字节数。
(ii)如果InputStream.read(Byte[] b)返回-1,则表示输入流结束。
(iii)arrSize存储读取的总字节数,即byte[] b的长度
(iv)ByteBuffer.wrap(byte[] b, int offset, int length) 将包装字节数组以提供 ByteBuffer。你可以检查这个reference
(v) ContentResolver.openInputStream(Uri uri) 和 InputStream.read(byte[] b) 会抛出 IOException,所以你必须处理它。
(vi) 注意:如果arrSize > MAX_SIZE 可能会发生IndexOutOfBoundException,您可能需要添加if-else 子句来处理此类问题。
如果有任何错误或有更快的方法,请随时评论或更改代码。快乐编码