Как получить BufferedInputStream из Multipart?

Я пытаюсь получить BufferedInputStream из загруженного файла cvs.

Я работаю с Multipart, полученным из файла cvs.

Когда я впервые получаю Multipart, это BufferedInputStream, но весь буфер пустой.

Извините. Качество картофеля

Но если я загляну глубже, в CoyoteInputStream есть еще один буфер, в котором есть данные.

Еще одна картошка, но мы экономим деньги, используя Paint от XP

Как я могу получить этот второй буфер? Мой код ниже.

И, конечно же, он генерирует нулевое исключение, когда доходит до

в то время как ((multiPartDataPos = stream.read(buffer)) >= 0)

Что я делаю неправильно? Я ошибаюсь, что CoyoteInputStream — это данные, которые мне нужны?

открытый байт [] handleUploadedFile (Multipart multiPart) выдает EOFException {

    Multipart multiPartData = null;
    BufferedInputStream stream = null;

    int basicBufferSize = 0x2000;

    byte[] buffer = new byte[basicBufferSize];

    int bufferPos = 0;

    try {

        while (multiPart.hasNext()) {

            int multiPartDataPos = bufferPos;

            multiPartData = (Multipart) multiPart.next();

            stream = new BufferedInputStream(multiPartData.getInputStream());

            while ((multiPartDataPos = stream.read(buffer)) >= 0) {

                int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);
                multiPartDataPos += len;
            }

            bufferPos = bufferPos + multiPartDataPos;
        }

    } ...

person mycowan    schedule 08.02.2016    source источник


Ответы (2)


Ваш код не имеет никакого смысла.

while ((multiPartDataPos = stream.read(buffer)) >= 0) {

К этому моменту вы прочитали multiPartDataPos байта в buffer, так что buffer[0..multiPartDataPos-1] содержит только что прочитанные данные.

    int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);

В этот момент вы выполняете еще одно чтение, которое может вернуть -1, что в противном случае добавит некоторые данные из multiPartPos в multiPartDataPos+len-.

    multiPartDataPos += len;

Этот шаг действителен, только если len > 0.

И вы ничего не делаете с буфером; и в следующий раз по кругу вы уничтожите все, что только что прочитали.

Правильный способ чтения любого потока в Java выглядит следующим образом:

while ((count = in.read(buffer)) > 0)
{
    // use buffer[9..count-1], for example out.write(buffer, 0, count);
}

Я не понимаю, почему вы думаете, что требуется доступ к базовому потоку или что он вам даст, чего у вас еще нет.

person user207421    schedule 08.02.2016
comment
Спасибо @EJP. Надеюсь, я смогу попробовать это позже сегодня. - person mycowan; 08.02.2016
comment
Я пробовал ваш метод, но продолжал получать пустой BufferedInputStream. Я попытался использовать обычный InputStream и был более успешным. Хотя я считаю, что использование BufferedInputStream было бы более эффективным. - person mycowan; 12.02.2016
comment
Определите «пустой BufferedInputStream». Чтение InputStream через BufferedInputStream должно быть идентично чтению InputStream напрямую, за исключением количества данных, которые вы получаете за раз. Если вы не злоупотребляете available(),, конечно. - person user207421; 12.02.2016

Оказывается, лучшим решением было использовать перемещение данных из InputStream в ByteArrayOutputStream, а затем вернуть ByteArrayOutputStream.toByteArray()

Multipart multiPartData = null;
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int read;
byte[] input = new byte[4096];
InputStream is;

try {
    multiPartData = (Multipart)multipart.next();
    is = multiPartData.getInputStream();
    while ((read = is.read(input, 0, input.length)) != -1) {
        buffer.write(input, 0, read);
    }

    buffer.flush();
    return buffer.toByteArray(); // just a test right now
}
person mycowan    schedule 12.02.2016