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

Ответы на вопрос(9)

Решение Вопроса

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

Edit:

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

Edit2

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

 ChronoXIII13 июл. 2009 г., 15:27
В настоящее время я сохраняю файл в поле большого двоичного объекта в базе данных и отправляю его как двоичный поток (входной поток как входной поток), теперь мне требуется входной поток в байтовом массиве, так как мне нужно сделать сигнатуру данных, а функция принимает только байт массивы.
 ChronoXIII13 июл. 2009 г., 15:34
Это может иметь место, поскольку изображение загружается пользователем, и я не могу найти способ автоматической обрезки изображений на стороне сервера. :(
 13 июл. 2009 г., 15:29
Как я уже говорил, item.get () возвращает вам байтовый массив. И не беспокойтесь о производительности и размере, если вы не работаете с несколькими изображениями в МБ.
 ChronoXIII13 июл. 2009 г., 15:55
Я изменил решение на этот пост, так как его ответ был более точно настроен для моей текущей настройки
 13 июл. 2009 г., 15:35
Что вы подразумеваете под автоматической обрезкой изображений? get () выдаст вам весь загруженный файл (изображение) в виде байта []. Затем вы продолжаете и используете его в любом OutputStream.write (), снова переносите его в ByteArrayInputStream и т. Д.

используя getBytes (inputStream) из Utils.java, проверьте следующую ссылку

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

 01 дек. 2015 г., 23:02
Разве это не должно быть правильным ответом? Есть проблемы с этим решением?
 04 янв. 2019 г., 17:29
Если вы планируете использовать поток ввода, он уже будет прочитан.

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

 13 июл. 2009 г., 15:17
Вы должны быть осторожны с преобразованиями байтов / символов. Это изначально поток байтов? Если он содержит символы, как они кодируются и т. Д. Если вы получаете их по сетевому соединению, я подозреваю, что это ваше основное узкое место в производительности, и я не буду беспокоиться о затратах на конвертацию.
 13 июл. 2009 г., 15:27
Это звучит неплохо!
 ChronoXIII13 июл. 2009 г., 15:15
Кажется, я обнаружил, что для inputtream есть метод toString (), а затем я могу просто вызвать getBytes (), чтобы создать байтовый массив из строки. Мне интересно, есть ли какие-либо проблемы с производительностью от этого?
 13 июл. 2009 г., 15:50
Да. Вы получаете полный необработанный байтовый массив, без преобразования, без проблем.
 ChronoXIII13 июл. 2009 г., 15:24
В настоящее время я читаю входной поток с изображением в базу данных в виде двоичного потока, это, кажется, работает хорошо, так как я могу прочитать файл после слов и его все еще изображение

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: ";
}
 15 июн. 2017 г., 18:37
Хорошо, я понимаю, так что это полезно, когда вы знаете, что ожидаете получитьString поток.\n действительно необходимо, потому что вы должны придать какой-то формат полученному вводу, я не хочу чоризо долгоStringтак что даже те\nна счет.
 07 февр. 2017 г., 00:29
-1, это предполагаетInputStream всегда является строкой (необязательно, потому что это могут быть двоичные данные), и в любом случае он не возвращает размер потока, который был задан вопросом. Кроме того, он добавляет дополнительные байты (\n) к данным такsb.length() также будет неточным.

однако вы можете запросить размер файла:

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

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

 13 июл. 2009 г., 15:14
Если ваш входной поток имеет поддержку mark (), вы можете пометить в начале и просто полностью прочитать его - затем выполнить reset () и начать его обработку.
 ChronoXIII13 июл. 2009 г., 15:16
файл представляет собой изображение (потенциально большое), поэтому чтение потока дважды приведет к проблемам с производительностью, не так ли?
 13 июл. 2009 г., 15:21
@ ChronoXIII: правда. Вот почему я попросил небольшой пример кода, чтобы мы могли увидеть ваш сценарий. Если ваше изображение уже находится в памяти (благодаря загрузке файла или что-то в этом роде), оно открывает дополнительные параметры.
 ChronoXIII13 июл. 2009 г., 15:12
В моем сценарии входной поток содержит загруженный файл из формы HTML, я не могу получить размер файла, так как не загружаю файл с жесткого диска.
 13 июл. 2009 г., 15:19
Попытайся. Если он очень медленный, у вас проблемы с производительностью. В противном случае вы не & # x2019; т. Это так просто.

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

Из JavaDocs:

Returns the number of remaining bytes that can be read (or skipped over) from this input stream. The value returned is count - pos, which is the number of bytes remaining to be read from the input buffer.

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

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

    int size = connInputStream.available();

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

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

но она все равно появилась первой, когда я решил проблему. Поэтому я просто хотел добавить это:

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

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

 27 янв. 2016 г., 18:34
Ответ вводит в заблуждение, как насчетAndroid docs, там четко сказано: "Обратите внимание, чтоthis method provides such a weak guarantee тотit is not very useful in practice& Quot ;.
 17 дек. 2013 г., 18:22
О, псих. Хорошо поймал! Я думаю, что этот трюк не подходит для кода, который должен быть переносимым. Я использовал для школьного проекта, поэтому он работал для меня. Спасибо, что приятно знать на будущее!
 18 мар. 2015 г., 10:36
Это неверно! Какdocumentation  сказал оavailable() Обратите внимание, что хотя некоторые реализации InputStream будут возвращать общее количество байтов в потоке, многие не будут. Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке. & Quot;
 17 дек. 2013 г., 01:23
Я не думаю, что это точно. Из Javadocs: «Обратите внимание, что хотя некоторые реализации InputStream будут возвращать общее количество байтов в потоке, многие не будут. Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке. & Quot; Таким образом, он может работать на вашей виртуальной машине, но может не работать на других.docs.oracle.com/javase/7/docs/api/java/io/…
 15 апр. 2014 г., 17:39
Это идеально, когда у вас есть все данные в памяти, как в ByteArrayInputStream.

Для InputStream

IoUtils.toByteArray(inputStream).length

Для необязательного & lt; MultipartFile & gt;

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

Ваш ответ на вопрос