获取文件频道的位置

时间:2016-09-28 16:03:19

标签: java swing file filechannel

我有一个类将一个文件从一个文件夹复制到另一个文件夹:

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。

如果可能,我想要一个解释。

感谢您的时间

3 个答案:

答案 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的间隔太快了。增加它所有的秒或半秒就足够了。