gpt4 book ai didi

java - 获取 ReadableByteChannel 到 FileOutputStream 的传输速率

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:16 25 4
gpt4 key购买 nike

我正在编写一个抓取工具,用于从某个站点下载 mp3 列表(1,700 多个 mp3,每个大约 15 MB)。我的方法给出了 URL 的 List 和目标文件夹。

我想围绕此编写一个 JProgressBar 对话框,其中包含:

  1. 当前传输速率。
  2. 当前正在下载的文件信息(已完成多少/还剩多少)。

我使用的 ReadableByteChannel 传输到 FileOutputStream(或者更准确地说,是从 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();
}
}

我的问题是:

  1. FileOutputStream::transferFrom 方法是否会抛出任何可以用 PropertyChangeListener 捕获的属性来提供此信息?
  2. 我使用的方法是否能够提供此信息?
  3. 您如何获得这些信息?

最佳答案

你没有捕获重点。 transferFrom() 理想情况下发生在内核中,根本不需要咨询应用程序。这就是重点。您要么需要进度指示(可以通过套接字或 URLConnection 输入流周围的 ProgressMonitorInputStream 获得),要么需要快速的内核模式复制。你不能两者兼得。

注意:

  1. 该方法是 FileChannel.transferFrom(), 而不是 FileOutputStream::transferFrom()。

  2. 单次调用是不够的。你必须循环。不保证在一次调用中转移全部金额。

关于java - 获取 ReadableByteChannel 到 FileOutputStream 的传输速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24900337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com