如何确定DataHandler.writeTo()方法当前已写入的字节数?

4

我需要使用MTOM从Web服务下载文件。我不知道下面的实现细节。我是这样做的,它可以工作(响应是从Web服务返回的对象,数据是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应用程序中的进度条)。
我的想法是以某种方式扩展DataHandler,然后定期询问已写入多少字节。但我是Java新手,不知道如何实现它。
2个回答

1
如果您将所有内容读入一个byte[],您需要足够的内存来容纳整个文件。现在这可能不是您的问题,但最好不要养成这种坏习惯(它很容易使服务器崩溃)。 Apache CommonsGoogle Guava都有一个CountingOutputStream类,可以完全满足您的要求,它可以计算写入了多少字节。如果您无法使用这些库,那么您可以编写一个类似的类,只需实现OutputStream接口,在构造函数中接收另一个OutputStream对象,并且每个方法只需增加byteCount并委托调用即可。

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接