我有一个类将一个文件从一个文件夹复制到另一个文件夹:
public class Foo extends JFrame{
Timer t;
FileChannel inp = null,
outp= null;
File sourceFile = new File("C:/movies/movie.mkv"),
destFile = new File("C:/test/movie.mkv");
long rec = 0;
long size;
LayoutManager manager = new MigLayout();
public void createUI(){
JPanel panel = new JPanel();
JButton copyFile = new JButton("Copy file");
JButton btn = new JButton("Start function");
JButton stop = new JButton("Stop function");
panel.setLayout(manager);
panel.add(btn);
panel.add(copyFile,"wrap");
panel.add(stop);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setContentPane(panel);
this.setVisible(true);
this.setSize(400,400);
this.pack();
btn.addActionListener((e)->{
try {
inp = new FileInputStream(sourceFile).getChannel();
outp = new FileOutputStream(destFile).getChannel();
size = inp.size();
outp.transferFrom(inp,0,size);
} catch (Exception e2) {
// TODO Auto-generated catch block
System.out.println("FIle not found");
return;
}
t = new Timer(100,i->{
try {
rec = outp.position();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
rec = 0;
}
finally{
System.out.println("Position in file:"+rec);
}
});
t.start();
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(()->new Foo().createUI());
}
}
现在我有一个Swing计时器,每100ms输出一次File中的位置。
我实际上要做的是让用户知道已经复制了多少文件。问题是我的控制台输出的数字每隔100毫秒就是#34;文件中的位置:126089692&# 34。
如果可能,我想要一个解释。
感谢您的时间
答案 0 :(得分:1)
我在https://docs.oracle.com/javase/8/docs/api/找到了:
public abstract long transferFrom(ReadableByteChannel src,
long position,
long count)
throws IOException-
“......此方法不会修改此频道的位置......”
也许这就是为什么你看到相同的值(我没有检查它)。
尝试替换:
rec = outp.position();
通过
rec = inp.position();
答案 1 :(得分:0)
这是因为您首先复制整个文件(outp.transferFrom(inp,0,size);
),然后启动计时器 - 工作已经完成。尝试在实际数据传输之前启动计时器。
答案 2 :(得分:0)
transferFrom方法不是异步执行的。计时器启动时已经完成。
考虑将try..catch部分(文件传输)移动到自己的线程,首先启动计时器,然后启动传输线程。
而BTW:对于GUI来说,100 ms的间隔太快了。增加它所有的秒或半秒就足够了。