Я пытаюсь отправить файлы на сервер. Я получаю 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);
boolean didSend = sendMultipartChunk(upFile, fileChunk, buffer); ??? Как это могло работать? Вы должны учитывать, сколько байтов находится в этом буфере. Сколько read похоже на boolean didSend = sendMultipartChunk(upFile, fileChunk, buffer, read);Я тестировал это с несколькими расширениями файлов и несколькими размерами файлов. Каждый раз, когда размер файла меньше 2 ГБ, все работает нормально, если он превышает 2 ГБ, он читает до этой точки, а затем возвращает -1 (даже с файлом 10 ГБ). Я обнаружил, что единственное, что имеет хоть какое-то отношение к этой проблеме, - это то, что inputstream.read () ограничен 2 ГБ.
Мусор. Он ограничен размером буфера. Размер буфера - AppController.UPLOAD_CHUNK_SIZE. По определению, это меньше 2 ГБ. Проблема не в этом. Вы лаете не на то дерево. Вы также игнорируете счетчик байтов, возвращаемый read() при записи, как уже было указано @greenapps. Исправьте свой код.
Я голосую за закрытие этого вопроса, потому что OP должен указать структуру данных, которую он хочет прочитать, которая может сначала поддерживать более 2 ГБ в основной памяти.




read()ограниченInteger.MAX_VALUE, но также и размер массива байтов, в который вы читаете, поэтому остается неясным, почему это проблема. Превышение этого значения не приводит к тому, чтоread()возвращает -1. Единственное, что это делает, - это достижение конца файла. Вы лаете не на то дерево.