it-roy-ru.com

Определить размер InputStream

Моя текущая ситуация такова: я должен прочитать файл и поместить содержимое в InputStream. После этого мне нужно поместить содержимое InputStream в байтовый массив, который требует (насколько мне известно) размер InputStream. Есть идеи?

По запросу я покажу поток ввода, который я создаю из загруженного файла.

InputStream uploadedStream = null;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
Java.util.List items = upload.parseRequest(request);      
Java.util.Iterator iter = items.iterator();

while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (!item.isFormField()) {
        uploadedStream = item.getInputStream();
        //CHANGE uploadedStreambyte = item.get()
    }
}

Запрос представляет собой объект HttpServletRequest, который похож на FileItemFactory и ServletFileUpload из пакета Apache Commons FileUpload.

49
ChronoXIII

Я просто хотел добавить, что у Apache Commons IO есть утилиты поддержки потоков для выполнения копирования. (Кстати, что вы подразумеваете под помещением файла во входной поток? Можете ли вы показать нам свой код?)

Правка:

Хорошо, что вы хотите сделать с содержимым элемента? Существует item.get()которая возвращает всю вещь в байтовом массиве.

Edit2

item.getSize() вернет загруженный размер файла .

11
akarnokd

Это ДЕЙСТВИТЕЛЬНО старая тема, но она все равно появилась первой, когда я нашел проблему. Так что я просто хотел добавить это:

InputStream inputStream = conn.getInputStream();
int length = inputStream.available();

Работал на меня. И НАМНОГО проще, чем другие ответы здесь. 

33
W. B. Reed

Я хотел бы прочитать в ByteArrayOutputStream , а затем вызвать toByteArray () , чтобы получить результирующий байтовый массив. Вам не нужно заранее определять размер (хотя, возможно, это оптимизация , если вы это знаете. Во многих случаях вы этого не сделаете)

32
Brian Agnew

Вы не можете определить количество данных в потоке, не читая их; однако вы можете запросить размер файла:

http://Java.Sun.com/javase/6/docs/api/Java/io/File.html#length ()

Если это невозможно, вы можете записать байты, которые вы прочитали из входного потока, в ByteArrayOutputStream , который будет увеличиваться по мере необходимости.

16
Andrew Duffy

вы можете получить размер InputStream, используя getBytes (inputStream) из Utils.Java, проверьте следующую ссылку

Получить байты из Inputstream

4
Gnanam R

Для InputStream

IoUtils.toByteArray(inputStream).length

Для необязательного <MultipartFile>

Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
1
amstegraf

Если вы знаете, что ваш InputStream является FileInputStream или ByteArrayInputStream, вы можете использовать небольшое отражение, чтобы получить размер потока без чтения всего содержимого . Вот пример метода:

static long getInputLength(InputStream inputStream) {
    try {
        if (inputStream instanceof FilterInputStream) {
            FilterInputStream filtered = (FilterInputStream)inputStream;
            Field field = FilterInputStream.class.getDeclaredField("in");
            field.setAccessible(true);
            InputStream internal = (InputStream) field.get(filtered);
            return getInputLength(internal);
        } else if (inputStream instanceof ByteArrayInputStream) {
            ByteArrayInputStream wrapper = (ByteArrayInputStream)inputStream;
            Field field = ByteArrayInputStream.class.getDeclaredField("buf");
            field.setAccessible(true);
            byte[] buffer = (byte[])field.get(wrapper);
            return buffer.length;
        } else if (inputStream instanceof FileInputStream) {
            FileInputStream fileStream = (FileInputStream)inputStream;
            return fileStream.getChannel().size();
        }
    } catch (NoSuchFieldException | IllegalAccessException | IOException exception) {
        // Ignore all errors and just return -1.
    }
    return -1;
}

Это может быть расширено для поддержки дополнительных входных потоков, я уверен.

0
Travis Parks

Если вы явно имеете дело с ByteArrayInputStream, то, вопреки некоторым комментариям на этой странице, вы можете использовать функцию .available(), чтобы получить размер. Просто нужно сделать это, прежде чем начать читать с него.

Из JavaDocs:

Возвращает количество оставшихся байтов, которые могут быть прочитаны (или пропущены Over) из этого входного потока. Возвращаемым значением является count - pos, который количество байтов, оставшихся для чтения из входного буфера.

https://docs.Oracle.com/javase/7/docs/api/Java/io/ByteArrayInputStream.html#available ()

0
Sverrir Sigmundarson