我必须使用MTOM从Web服务下载文件。我不知道以下实施细节。我这样做,有效(响应是从webservices返回的对象,数据是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();
但是,我需要弄清楚,下载过程中写入了多少字节。这可能需要很长时间,这种方式只需等待完成下载然后关闭输出流并继续。
我知道,我可能需要另一个线程来读取写入的字节数并用它做一些事情(需要它来更新SWT应用程序中的progressBar)。
我的想法是扩展DataHandler,然后定期询问,写入了多少字节)。但我是java noob,我不知道如何实现它。
答案 0 :(得分:0)
我做了一些研究,之前我忽略了名为getInputStream()的DataHandler方法。使用这种方法,我可以做我需要的:
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();
答案 1 :(得分:0)
如果您将所有内容都读到byte[]
,则需要足够的内存来容纳整个文件。这对你来说可能不是一个问题,但最好不要造成这种坏习惯(很容易让服务器崩溃)。
Apache Commons和Google Guava有一个CountingOutputStream
类,可以完全按照您的意愿执行,只计算写入的字节数。如果你不能使用这个库,你可以编写一个类似的类,只需实现OutputStream
,在构造函数中接收另一个OutputStream
,每个方法只增加byteCount
和委托。