Как определить количество байтов, написанных в настоящее время методом DataHandler.writeTo ()?

Мне нужно загрузить файл с веб-службы с помощью MTOM. Детали реализации ниже не известны мне. Я делаю это так, что работает (ответ - это объект, возвращаемый из веб-сервисов, а данные - это код javax.activation.DataHandler , filePath - это файл, в котором я хочу сохранить скачанный файл содержание):

DataHandler dataHandler = response.getData();
File file = new File(filePath);
FileOutputStream fileOutputStream = new FileOutputStream(file);
dataHandler.writeTo(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();

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

Я знаю, мне, вероятно, понадобится еще один поток для чтения количества написанных байтов и что-то с ним сделать (нужно его для обновления progressBar в приложении SWT).

Моя идея заключалась в том, чтобы каким-то образом расширить DataHandler, а затем периодически спрашивать, сколько байтов написано). Но я java noob, и я не знаю, как это реализовать.

3
nl ja de

2 ответы

Если вы все прочитаете в byte [] , вам понадобится достаточно памяти для хранения всего файла. Это может быть не проблема для вас сейчас, но хорошо не создавать эту плохую привычку (которая может легко опустить сервер).

Apache Commons and Google Guava have a CountingOutputStream class that does exactly what you want, just count how many bytes where wrote. If you can't use this libraries, you can write a similar class, just implement OutputStream, receive another OutputStream in the constructor and each method just increment the byteCount and delegates.

0
добавлено

Я провел некоторое исследование, и я забыл метод DataHandler, называемый getInputStream() раньше. Используя этот метод, я могу сделать то, что мне нужно:

DataHandler dataHandler = response.getData();
File file = new File(filePath);
FileOutputStream fileOutputStream = new FileOutputStream(file);

// got Input Stream from DataHandler
InputStream is = dataHandler.getInputStream();

// then I can manage writing file my way        
byte data[] = new byte[BUFFER_SIZE];
int br;
Long bytesWritten = 0L;
while ((br = is.read(data)) > 0) {
    fileOutputStream.write(data, 0, br);
    bytesWritten = bytesWritten + br;
   //call some method to update UI progressBar
}

// this is now useless:
// dataHandler.writeTo(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async