Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java进度条帮助_Java_Progress Bar_Fileoutputstream - Fatal编程技术网

Java进度条帮助

Java进度条帮助,java,progress-bar,fileoutputstream,Java,Progress Bar,Fileoutputstream,我需要为以下任务延迟实现一个进度条 FileOutputStream Fos= new FileOutputStream(FilePath); byte buffer[]=Services.downloadFile(FilePath); Fos.write(buffer); 现在,我如何知道该文件已下载了多少以更新进度条?这并不容易,因为服务。downloadFile()不会将文件分块提供给您。如果你有一个循环,它会很简单 如果您可以更改API,我建议您这样更改: Services.downl

我需要为以下任务延迟实现一个进度条

FileOutputStream Fos= new FileOutputStream(FilePath);
byte buffer[]=Services.downloadFile(FilePath);
Fos.write(buffer);

现在,我如何知道该文件已下载了多少以更新进度条?这并不容易,因为
服务。downloadFile()
不会将文件分块提供给您。如果你有一个循环,它会很简单

如果您可以更改API,我建议您这样更改:

Services.downloadFile(File, OutputStream);
然后让
downloadFile()
将文件写入流中。现在,您可以通过重载各种版本的
write()
来包装流并计算写入的字节数

[EDIT]我看到
服务
是一个RMI代理。在这种情况下,您不能使用上述方法。相反,它变得更加复杂:

你需要在你的服务器上有一个下载池(想想“地图”)。该池允许您为每次下载请求另一个数据块

因此,在服务器上,您需要:

  • 创建一个处理下载并具有
    byte[]read()
    方法的对象
  • 使用键将对象放入地图中。以某种方式将密钥发送给客户端
  • 对于每个对象,创建一个实际下载数据并将数据添加到缓冲区的线程。
    read()
    方法返回缓冲区的内容并将其清除
  • 在客户机上:

  • 您需要在服务器上调用一个方法来创建一个新的下载对象并启动下载线程
  • 现在您需要一个循环来调用服务器上的下载对象上的
    read()
    。API类似于
    read(key)
    ,服务器在映射中查找密钥,然后在下载对象上调用
    read()
  • 在将读取调用的结果写入文件时显示进度

  • Services
    类从何而来?我使用的是RMI,服务是一个代理,这段代码就像在客户端上一样,我正在使用RMI从服务器请求一个文件