Сохраните Vaadin7 StreamResource в файл

У меня есть объект класса StreamResource с некоторым необходимым содержимым. Я уверен, что этот контент действителен, и мне нужно сохранить его локально для дальнейшей обработки. Вот фрагмент кода:

OutputStream os = new FileOutputStream(filePath, false);

byte[] buffer = new byte[1024];
int bytesRead;
//read from is to buffer
try {
    while(true)
    {
         bytesRead = resource.getStream().getStream().read(buffer);
         if(bytesRead == -1)
             break;

         os.write(buffer, 0, bytesRead);
         resource.getStream().getStream().skip(bytesRead);
    }
    os.flush();
    os.close();
} catch (IOException e) {
    e.printStackTrace();
}

И вот я присоединяюсь к бесконечному циклу. Разрыв никогда не происходит, и файл в нужном месте становится огромным, как и должно быть на самом деле. В отладчике я вижу, что операция read () возвращает только 1-й блок байтов на каждой итерации, даже с вызовом skip () после os.write.

Как мне читать контент из потока?

Спасибо.


person user1053031    schedule 24.05.2016    source источник
comment
Какой вариант использования? Загружает ли пользователь что-нибудь в ваше приложение Vaadin?   -  person Steffen Harbich    schedule 24.05.2016
comment
Нет, я сам создаю контент. Здесь нет загрузки.   -  person user1053031    schedule 24.05.2016


Ответы (1)


Согласно исходному коду StreamResource новый DownloadStream создается при каждом вызове. Вы должны вызвать его только один раз, как в следующем фрагменте:

OutputStream os = new FileOutputStream(filePath, false);

byte[] buffer = new byte[1024];
int bytesRead;
//read from is to buffer
try {
    DownloadStream stream = resource.getStream();
    while(true)
    {
         bytesRead = stream.getStream().read(buffer);
         if(bytesRead == -1)
             break;

         os.write(buffer, 0, bytesRead);
    }
    os.flush();
    os.close();
} catch (IOException e) {
    e.printStackTrace();
}

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

person Steffen Harbich    schedule 24.05.2016
comment
Спасибо за Ваш ответ. Попробую чуть позже - сейчас я далеко от рабочего окружения. Кажется, у меня небольшой опыт. рабочая с потоками (( - person user1053031; 24.05.2016