Java SwingWorker异常
我有一个从网站下载大文件并用jProgressBar显示进程的类。 我使用的是SwingWorker类和doInBackground方法。它工作正常,但当下载文件的大小>20mb时,我得到一个java.lang.IllegalArgumentException:该值应该在0到100之间。我做错了什么?请帮帮我!我的代码:Java SwingWorker异常,java,swing,file-io,swingworker,Java,Swing,File Io,Swingworker,我有一个从网站下载大文件并用jProgressBar显示进程的类。 我使用的是SwingWorker类和doInBackground方法。它工作正常,但当下载文件的大小>20mb时,我得到一个java.lang.IllegalArgumentException:该值应该在0到100之间。我做错了什么?请帮帮我!我的代码: @Override protected Void doInBackground() throws Exception { URL url = new U
@Override
protected Void doInBackground() throws Exception {
URL url = new URL(site);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int filesize = connection.getContentLength();
int totalDataRead = 0;
try (java.io.BufferedInputStream in = new java.io.BufferedInputStream(
connection.getInputStream())) {
java.io.FileOutputStream fos = new java.io.FileOutputStream(file);
try (java.io.BufferedOutputStream bout = new BufferedOutputStream(
fos, 1024)) {
byte[] data = new byte[1024];
int i;
while ((i = in.read(data, 0, 1024)) >= 0) {
totalDataRead = totalDataRead + i;
bout.write(data, 0, i);
int percent = (totalDataRead * 100) / filesize;
setProgress(percent);
}
}
}
return null;
}
}
在玩弄了你的计算之后,这个
int percent = (totalDataRead * 100) / filesize;
在我看来,这只是个错误(这可能只是我可怜的数学大脑),但在40mb的内存中,大约20.48mb(或51%),它又变成了一个负数(-51%)
如果我使用
int percent = Math.round(((float)count / (float)range) * 100f);
它很好用
也可以考虑编写<代码>文件化< <代码> >代码> TooDATALADA< <代码> > < <代码> >而不是<代码> int >代码>,但那只是我。
我用一个可运行的例子来测试它import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JProgressBar pb;
public TestPane() {
pb = new JProgressBar();
setLayout(new GridBagLayout());
add(pb);
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
int range = 40 * (1024 * 1024);
for (int count = 0; count < range; count += 1024) {
int percent = Math.round(((float)count / (float)range) * 100f);
setProgress(percent);
Thread.sleep(1);
}
return null;
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (null != evt.getPropertyName()) {
switch (evt.getPropertyName()) {
case "progress":
pb.setValue(worker.getProgress());
break;
}
}
}
});
worker.execute();
}
}
}
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JProgressBar;
导入javax.swing.SwingWorker;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
私人JProgressBar pb;
公共测试窗格(){
pb=新的JProgressBar();
setLayout(新的GridBagLayout());
添加(pb);
SwingWorker worker=新SwingWorker(){
@凌驾
受保护对象doInBackground()引发异常{
整数范围=40*(1024*1024);
用于(整数计数=0;计数<范围;计数+=1024){
整数百分比=数学四舍五入(((浮动)计数/(浮动)范围)*100f);
进度(百分比);
睡眠(1);
}
返回null;
}
};
worker.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(属性更改事件evt){
if(null!=evt.getPropertyName()){
开关(evt.getPropertyName()){
案例“进展”:
pb.setValue(worker.getProgress());
打破
}
}
}
});
worker.execute();
}
}
}
提示:int
可以容纳的最大值是多少?20MB*100字节是多少?对于。我加了一个,但根据我删除的答案,我仍然建议监听SwingWorker.StateValue.DONE
,并在收到通知时调用get()
,完成异常处理。@hoverCraftFullOfels同意。在我的测试课上,我曾尝试过做一些类似的事情,但重点放在了calculationMadProgrammer上——谢谢你们的帮助。它很好用。(谢谢)