Java 获取ReadableByeChannel到FileOutputStream的传输速率
我正在写一个从某个网站下载MP3列表的刮板(1700多个MP3,每个大约15MB)。我的方法提供了一个URL的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
列表和一个目标文件夹
我想围绕此编程一个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(),
notFileOutputStream::transferFrom()。
一个电话是不够的。你必须循环。不能保证在一次通话中转移全部金额
这就是我的第2个问题的答案,我使用的方法能够提供这些信息吗?
所以,答案是否定的。我从一个So问题中得到了这个方法:。因此,我必须找出如何在没有transferFrom()
的情况下执行此操作。我已经告诉过您如何在没有transferFrom()的情况下执行此操作。
很高兴看到有人说必须在循环中调用transferFrom
。在添加代码以关闭FileOutputStream
(尝试块)。现在每个文件都完全传输,没有问题。您确定它必须循环吗?