InputStream с файлами размером более 2 ГБ

Я пытаюсь отправить файлы на сервер. Я получаю Uri, получаю inputstream с getContentResolver().openInputStream(uri), а затем перехожу к чтению фрагментов файла и отправке их на сервер в виде нескольких частей.

Все это работает нормально, пока размер файла, который я пытаюсь отправить, не превышает 2 ГБ. Когда файл превышает это значение, процесс работает нормально до ~ 2 ГБ, затем результат вызова .read () равен -1, даже если файл далеко не полностью прочитан.

После поиска в сети я обнаружил, что чтение inputstream ограничено Integer.MAX_VALUE. Но я не нашел для этого обходного пути. Итак, я предполагаю, что мой вопрос: есть ли какой-нибудь метод, с помощью которого я могу прочитать более 2 ГБ?

Вот упомянутый код:

InputStream is = getContentResolver().openInputStream(fileUri);

if (is != null) {

    byte[] buffer;
    int maxBufferSize = AppController.UPLOAD_CHUNK_SIZE;
    buffer = new byte[maxBufferSize];

    int fileChunk = 0;
    int read;

    while ((read = is.read(buffer)) != -1) {

        boolean didSend = sendMultipartChunk(upFile, fileChunk, buffer);
        if (didSend) {
            fileChunk++;
        } else {
            uploadedFiles.add(new UploadableFileDTO(true));
            checkIfFinished();
            break;
            }


    }
    is.close();
    sendEndUpload(upFile);
read() ограничен Integer.MAX_VALUE, но также и размер массива байтов, в который вы читаете, поэтому остается неясным, почему это проблема. Превышение этого значения не приводит к тому, что read() возвращает -1. Единственное, что это делает, - это достижение конца файла. Вы лаете не на то дерево.
user207421 25.04.2018 12:19
boolean didSend = sendMultipartChunk(upFile, fileChunk, buffer); ??? Как это могло работать? Вы должны учитывать, сколько байтов находится в этом буфере. Сколько read похоже на boolean didSend = sendMultipartChunk(upFile, fileChunk, buffer, read);
greenapps 25.04.2018 12:28

Я тестировал это с несколькими расширениями файлов и несколькими размерами файлов. Каждый раз, когда размер файла меньше 2 ГБ, все работает нормально, если он превышает 2 ГБ, он читает до этой точки, а затем возвращает -1 (даже с файлом 10 ГБ). Я обнаружил, что единственное, что имеет хоть какое-то отношение к этой проблеме, - это то, что inputstream.read () ограничен 2 ГБ.

DirtyJoe 25.04.2018 12:38

Мусор. Он ограничен размером буфера. Размер буфера - AppController.UPLOAD_CHUNK_SIZE. По определению, это меньше 2 ГБ. Проблема не в этом. Вы лаете не на то дерево. Вы также игнорируете счетчик байтов, возвращаемый read() при записи, как уже было указано @greenapps. Исправьте свой код.

user207421 25.04.2018 12:58

Я голосую за закрытие этого вопроса, потому что OP должен указать структуру данных, которую он хочет прочитать, которая может сначала поддерживать более 2 ГБ в основной памяти.

Joshua 25.04.2018 17:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
281
0

Другие вопросы по теме