Вопрос

Я пытаюсь прочитать содержимое из 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 для решения такой проблемы.

Пожалуйста, не стесняйтесь комментировать или изменять код, если есть какая-либо ошибка или если есть более быстрый способ сделать это.Счастливого кодирования

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top