// 一共三个类,分别为封装好后的MyFileChooser类,Botton类和测试类
package homework; import java.awt.Container; import java.io.File; import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; public class MyFileChooser extends JFileChooser{ public File fileChooser(Container c) { // 方法参数为容器变量 FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); this.setFileFilter(filter);// 这两句用于至供选择图片,可以不要 int x = this.showOpenDialog(c);// 定义int类型变量x用于储存用户的选择,如用户选择取消则返回值为1 if(x == 1) { return null; } File f = this.getSelectedFile();// 定义File类型变量接受选择后的文件,并返回 return f; } }
package work; import java.awt.Container; import javax.swing.JButton; public class MyJBotton extends JButton{ public MyJBotton(String info,int x,int y,Container c) { this.setText(info); this.setBounds(x, y, 100, 20); c.add(this); } }
package homework; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.swing.JFrame; import javax.swing.JOptionPane; public class MyTestFrame extends JFrame{ // 定义一个全局变量f private File f; public MyTestFrame() { this.setLayout(null); MyJBotton b1 = new MyJBotton("选择文件", 200, 100, this); MyJBotton b2 = new MyJBotton("复制文件", 200, 200, this); b1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { MyFileChooser fc = new MyFileChooser(); // new一个MyFileChooser对象以便调用其方法 f = fc.fileChooser(MyTestFrame.this); // 调用选择方法后将对象引用传给f全局变量 System.out.println(f.getAbsolutePath()); // 在控制台打印出源文件路径作为记录 } }); b2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fileSave(f); // 调用文件复制方法 JOptionPane.showMessageDialog(null, "复制成功!"); } }); this.setSize(500, 500); this.setVisible(true); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); this.setResizable(false); this.setTitle("TEST"); } private void fileSave(File f) { InputStream in = null; OutputStream out = null; File fold = new File("copy"); // 在当前工程中创建新目录对象"copy" if(fold.exists() == false) { // 如"copy"目录在当前工程中不存在则新建一个 fold.mkdirs(); } try { in = new FileInputStream(f.getAbsolutePath()); // 父类对象调用子类构造方法,传入源文件绝对地址,注意必须为文件绝对地址! out = new FileOutputStream("copy/" + f.getName()); // 父类对象调用子类构造方法,传入新地址,注意必须为文件绝对地址! byte[] by = new byte[10240]; // 采用byte数组来传输字节流 int len = 0; while((len = in.read(by)) != -1) { // 每次从in中读取by存入内存中,并记录每次传输长度 out.write(by, 0, len); // 三个参数分别为每次传输的byte长度,开始传输的长度,每次传输的长度,直到全部写入新文件中 } } catch (Exception e) { e.printStackTrace(); } finally { try { out.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { MyTestFrame m = new MyTestFrame(); } }