今天为了测试写了个小程序,一个小窗口,点击按钮时会复制一个大文件,通过Process执行cmd命令,然后界面显示“正在复制”,复制完了读取文件大小并显示“复制完成”。先开始我在按钮事件里面这么写:
JButton b=new JButton("点击启动");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
l.setText("正在复制");
l.setBounds(127, 50, 125, 19);
Process p=Runtime.getRuntime().exec("cmd /c copy /y \"D:\\工具\\系统镜像\\deepin-15.11-64位.iso\" \"E:\\中转\\deepin-15.11-64位.iso\"");
System.out.println(new File("E:\\中转\\deepin-15.11-64位.iso").length());
l.setText("复制完成");
} catch (IOException e) {
e.printStackTrace();
}
}
});
我想让它在复制的时候显示“正在复制”,完成后显示“复制完成”,并显示复制后文件大小。
结果点击按钮后直接显示复制完成,显示大小为0。
原来点击按钮时,Process p...语句及下面语句一起执行了,还没等复制完,他就显示“复制完成”并读取大小了。我想要等Process执行完了再执行下面的读取大小和显示“复制完成”字样,当然Process类里面有waitFor()方法,放在Process下面,就可以实现等待命令执行完了再向下走,于是我改成这样:
JButton b=new JButton("点击启动");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
l.setText("正在复制");
l.setBounds(127, 50, 125, 19);
Process p=Runtime.getRuntime().exec("cmd /c copy /y \"D:\\工具\\系统镜像\\deepin-15.11-64位.iso\" \"E:\\中转\\deepin-15.11-64位.iso\"");
p.waitFor(); //执行命令后等待期完成再向下执行
System.out.println(new File("E:\\中转\\deepin-15.11-64位.iso").length());
l.setText("复制完成");
} catch (Exception e) {
e.printStackTrace();
}
}
});
结果我发现