有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我必须使用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,然后定期询问(写入了多少字节)。但我是JavaNoob,我不知道如何实现它


共 (2) 个答案

  1. # 1 楼答案

    我做了一些研究,之前忽略了名为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();
    
  2. # 2 楼答案

    如果将所有内容都读到byte[],则需要足够的内存来保存整个文件。现在这对你来说可能不是问题,但最好不要养成这种坏习惯(这很容易让服务器停机)

    Apache CommonsGoogle Guava有一个CountingOutputStream类,它可以完全满足您的需求,只需计算写入的字节数。如果不能使用这个库,可以编写一个类似的类,只需实现OutputStream,在构造函数中接收另一个OutputStream,每个方法只需增加byteCount和委托