Подтвердить что ты не робот

Определите размер 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.

4b9b3361

Ответ 1

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

Edit:

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

Edit2

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 6

Для InputStream

org.apache.commons.io.IoUtils.toByteArray(inputStream).length

Необязательно & lt; MultipartFile>

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

Ответ 7

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

Из JavaDocs:

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

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

Ответ 8

Если вы знаете, что ваш 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;
}

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

Ответ 9

Используйте этот метод, вам просто нужно передать InputStream

public String readIt(InputStream is) {
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);

        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        is.close();
        return sb.toString();
    }
    return "error: ";
}

Ответ 10

    try {
        InputStream connInputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    int size = connInputStream.available();

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

InputStream - Android SDK | Разработчики Android