Java 获取ReadableByeChannel到FileOutputStream的传输速率

Java 获取ReadableByeChannel到FileOutputStream的传输速率,java,fileoutputstream,Java,Fileoutputstream,我正在写一个从某个网站下载MP3列表的刮板(1700多个MP3,每个大约15MB)。我的方法提供了一个URL的列表和一个目标文件夹 我想围绕此编程一个JProgressBar对话框,该对话框具有: 当前传输速率 当前正在下载的文件信息(完成多少/剩下多少) 我使用的是Techannel可读的文件输出流(或者更准确地说,是从RBC传输的FOS) 代码如下: private static void download(List<String> mp3_urls, String direct

我正在写一个从某个网站下载MP3列表的刮板(1700多个MP3,每个大约15MB)。我的方法提供了一个URL的
列表和一个目标文件夹

我想围绕此编程一个
JProgressBar
对话框,该对话框具有:

  • 当前传输速率
  • 当前正在下载的文件信息(完成多少/剩下多少)
  • 我使用的是Techannel可读的
    文件输出流
    (或者更准确地说,是从RBC传输的FOS)

    代码如下:

    private static void download(List<String> mp3_urls, String directory) {
        try {
            for(String mp3_url : mp3_urls) {
                URL url = new URL(mp3_url);
                try (ReadableByteChannel rbc = Channels.newChannel(url.openStream());) {
                    Pattern pattern = Pattern.compile("[A-Za-z0-9_]*\\.mp3");
                    Matcher matcher = pattern.matcher(mp3_url);
                    matcher.find();
    
                    System.out.println("Reading: " + mp3_url);
                    try (FileOutputStream fos = new FileOutputStream(directory + File.separator + matcher.group())) {
                        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void下载(列出mp3\u URL、字符串目录){
    试一试{
    用于(字符串mp3\u url:mp3\u url){
    URL URL=新URL(mp3_URL);
    try(ReadableByteChannel rbc=Channels.newChannel(url.openStream());){
    模式=模式。编译(“[A-Za-z0-9\]*\\.mp3”);
    Matcher Matcher=pattern.Matcher(mp3\uurl);
    matcher.find();
    System.out.println(“读取:+mp3\uURL”);
    try(FileOutputStream fos=newfileoutputstream(directory+File.separator+matcher.group()){
    fos.getChannel().transferFrom(rbc,0,Long.MAX_值);
    }
    }
    }
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    }
    
    我的问题是:

  • FileOutputStream::transferFrom
    方法是否抛出任何可以通过提供此信息的
    PropertyChangeListener
    捕获的属性
  • 我是否使用能够提供此信息的方法
  • 你如何获得这些信息

  • 你没抓住重点
    transferFrom()
    最理想的情况是在内核中进行,而根本不需要咨询应用程序。这就是重点。您需要进程指示,可以通过套接字周围的
    ProgressMonitorInputStream
    URLConnection
    输入流获得,或者需要快速内核模式拷贝。你不能两者兼得

    注意:

  • 方法是
    FileChannel.transferFrom(),
    not
    FileOutputStream::transferFrom()。

  • 一个电话是不够的。你必须循环。不能保证在一次通话中转移全部金额


  • 这就是我的第2个问题的答案,
    我使用的方法能够提供这些信息吗?
    所以,答案是否定的。我从一个So问题中得到了这个方法:。因此,我必须找出如何在没有
    transferFrom()
    的情况下执行此操作。我已经告诉过您如何在没有
    transferFrom()的情况下执行此操作。
    很高兴看到有人说必须在循环中调用
    transferFrom
    。在添加代码以关闭
    FileOutputStream
    (尝试
    块)。现在每个文件都完全传输,没有问题。您确定它必须循环吗?