我试图在Java中声明一个long值,遗憾的是它不起作用.
这是我的代码.它会导致以下错误消息:"int类型的文字4294967296超出范围".
long bytes = 4294967296;
Run Code Online (Sandbox Code Playgroud)
我需要这个值来制作一个文件过滤器,过滤掉大于4294967296字节(4GB)的文件.反过来工作没有任何问题(long size = file.length())与每个文件大小,这就是为什么我无法弄清楚为什么我的声明不起作用.
我需要一些关于JProgressBar组件的帮助.我的程序副本从一个地方到另一个文件使用java.nio FileChannels.实际的复制方法是transferFrom().
我现在有两个问题.
如何监控FileChannel的传输进度?我发现的所有教程都使用传统的java.io InputStreams,并在循环输入流时增加进度int.
我的复制方法(FileChannel方法)封装在一个单独的方法中,该方法由其他方法调用,这些方法迭代源文件夹和目标文件夹,然后为每个文件调用FileChannel方法.
如何为完整的复制机制实现ProgressBar?
好吧,我应该早一点阅读常见问题解答,所以我想我必须编辑我的初始帖子,而不是评论答案,对吧?
好的,这是我到目前为止所做的.正如jambjo建议的那样(感谢方式),该transferFrom()方法现在已经循环.顺便说一句:是否有一个更好的块大小,或者它取决于我的进度条的粒度,就像EJP所说的那样?
这是我的代码片段:
while (position < size) {
position += destination.transferFrom(source, position, chunkSize);
current = (position/size)*100;
System.out.println(current);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,'当前'值在循环内保持为0,我不知道为什么.我错过了什么吗?
再次感谢jambjo!我真的很感激你的意见!现在单个文件的进度监控工作,让我们解决我的第二个问题.
我不想,我不仅要监控一个文件的进度,而是监视一堆文件的进度.我的主要复制方法遍历各种目录并通过调用实际的传输方法复制适当的文件.因此复制方法不传输文件,它们只是选择实际传输方法的文件.
我想知道是否SwingWorker必须是我的主GUI中的嵌套类.我宁愿把它作为一个外部类来保持GUI与我的任何程序逻辑清晰.
我试图使SwingWorker类外部,这适用于该过程,遗憾的是我无法从SwingWorker类访问我的任何GUI字段.每当我尝试从SwingWorker的done()方法中访问属性(如标签或其他内容)时,我都会收到nullPointer异常.
任何建议将不胜感激!
首先非常感谢Jeff!到目前为止工作正常,即使我无法关注你提出的第二个选项.我的一个后台任务计算一定的大小(长值),所以从我的GUI中获取该值会很好.
你建议使用getter和setter但不幸的是我不知道如何在SwingWorker类中实现它们.
我试过这样的:
public void setSize(long totalSize) {
this.totalSize = totalSize;
}
public long getTotalSize() {
return totalSize;
}
Run Code Online (Sandbox Code Playgroud)
在doInBackground()方法结束时调用setter .不幸的是我无法使用get()GUI中的方法.
final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
public void run() {
// do something with w.get()
}
};
w.setRunnable(r);
w.execute();
Run Code Online (Sandbox Code Playgroud)
在我的情况下,"w"的对象创建不起作用,因为构造函数需要Runnable的对象.我错过了什么吗?请放轻松,这是我第一次使用SwingWorker.:)再次,非常感谢你的帮助!
java ×3
file ×1
jprogressbar ×1
long-integer ×1
nested-class ×1
nio ×1
swing ×1
swingworker ×1