Как обернуть содержимое Uri с помощью nio.Байтбуфер на Android?
-
21-12-2019 - |
Вопрос
Я пытаюсь прочитать содержимое из Uri на Android, и мне нужен конечный тип объекта, передаваемый в базовый SDK с помощью nio.ByteBuffer.
Я могу получить доступ к InputStream через ContentResolver, но не нашел способа обернуть его с помощью nio.Байтбуфер.
Есть ли способ преобразовать содержимое Uri в nio.Байтбуфер на Android?
Решение
Я закончил загрузить содержание URI локально и открыть его через другой метод, чтобы получить ByteBuffer
Другие советы
Предположим, вы работаете над каким-либо заданием,
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)
обернет массив байтов, чтобы получить байтовый буфер.Вы можете проверить это ссылка
(v) ContentResolver.openInputStream(Uri uri)
и InputStream.read(byte[] b)
вызовет исключение IOException, поэтому вы должны справиться с этим.
(vi) Предостережение: IndexOutOfBoundException
может случиться, если arrSize
> MAX_SIZE
, возможно, вам потребуется добавить предложение if-else для решения такой проблемы.
Пожалуйста, не стесняйтесь комментировать или изменять код, если есть какая-либо ошибка или если есть более быстрый способ сделать это.Счастливого кодирования