Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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 SwingWorker异常_Java_Swing_File Io_Swingworker - Fatal编程技术网

Java SwingWorker异常

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

我有一个从网站下载大文件并用jProgressBar显示进程的类。 我使用的是SwingWorker类和doInBackground方法。它工作正常,但当下载文件的大小>20mb时,我得到一个java.lang.IllegalArgumentException:该值应该在0到100之间。我做错了什么?请帮帮我!我的代码:

   @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上——谢谢你们的帮助。它很好用。(谢谢)