package jp.swtech;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.util.Date;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class FileCopyTool extends JFrame {
private static final long serialVersionUID = -2279866387292940681L;
private String pathDest = "";
private String pathSrc = "";
private DefaultListModel model = null;
public FileCopyTool(){
super();
setSize(250,400);
initComponents();
}
private void initComponents(){
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(10, 10, 10, 10);
JLabel lblDest = new JLabel("目标路径:");
txtDest = new JTextField(30);
btnClear = new JButton("清空");
btnClear.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
File[] fs = new File(pathDest).listFiles();
for(File f : fs){
f.delete();
}
}});
btnCopy = new JButton("拷贝");
btnCopy.addActionListener(new BtnCopyAction());
Box box = Box.createHorizontalBox();
box.add(lblDest);
box.add(Box.createHorizontalStrut(5));
box.add(txtDest);
box.add(Box.createHorizontalStrut(5));
box.add(btnClear);
box.add(btnCopy);
panel.add(box,BorderLayout.NORTH);
JLabel lblSrc = new JLabel("源路径:");
txtSrc = new JTextField(30);
btnLoad = new JButton("加载文件");
btnLoad.addActionListener(new BtnLoadAction());
box = Box.createHorizontalBox();
box.add(lblSrc);
box.add(Box.createHorizontalStrut(5));
box.add(txtSrc);
box.add(Box.createHorizontalStrut(5));
box.add(btnLoad);
panel.add(box,BorderLayout.SOUTH);
model = new DefaultListModel();
fileList = new JList(model);
fileList.addListSelectionListener(new SelectionListener());
panel.add(new JScrollPane(fileList),BorderLayout.CENTER);
add(panel);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(this);
}
private class SelectionListener implements ListSelectionListener{
public void valueChanged(ListSelectionEvent e) {
JList lst = (JList)e.getSource();
pathSrc = txtSrc.getText().trim() + File.separator + lst.getSelectedValue();
System.out.println("当前拷贝路径" + pathSrc);
}
}
private class BtnLoadAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
try {
model.removeAllElements();
pathDest = txtDest.getText().trim();
pathSrc = txtSrc.getText().trim();
if(checked()){
File file = new File(pathSrc);
File[] files = file.listFiles();
for(File f : files)
model.addElement(f.getName());
}
} catch (Exception e1) {
show("读取源目录发生异常!");
}
}
}
private class BtnCopyAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(checked()){
try {
for(File f : new File(pathDest).listFiles()){
if(f.isFile()) f.delete();
}
File fs = new File(pathSrc);
if(fs.isFile()){
File toFile = new File(pathDest + File.separator + fs.getName());
forImage(fs,toFile);
return;
}
File[] files = fs.listFiles();
for(File f : files){
if(!f.isFile()) return;
File toFile = new File(pathDest + File.separator + f.getName());
forImage(f,toFile);
}
show("复制文件成功!");
} catch (Exception e1) {
show("复制文件的时候发生异常!");
}
}
}
}
private boolean checked(){
if(pathDest.equals("")){
show("目标路径不能为空");
return false;
}
if(pathSrc.equals("")){
show("源路径不能为空");
return false;
}
return true;
}
private void show(String msg){
JOptionPane.showMessageDialog(this, msg,"错误",JOptionPane.ERROR_MESSAGE);
}
/**
* @param args
*/
public static void main(String[] args) {
FileCopyTool fct = new FileCopyTool();
fct.setVisible(true);
}
public static long forImage(File f1, File f2) throws Exception {
long time = new Date().getTime();
int length = 2097152;
FileInputStream in = new FileInputStream(f1);
RandomAccessFile out = new RandomAccessFile(f2, "rw");
FileChannel inC = in.getChannel();
MappedByteBuffer outC = null;
MappedByteBuffer inbuffer = null;
byte[] b = new byte[length];
while (true) {
if (inC.position() == inC.size()) {
inC.close();
outC.force();
out.close();
return new Date().getTime() - time;
}
if ((inC.size() - inC.position()) < length) {
length = (int) (inC.size() - inC.position());
} else {
length = 20971520;
}
b = new byte[length];
inbuffer = inC.map(MapMode.READ_ONLY, inC.position(), length);
inbuffer.load();
inbuffer.get(b);
outC = out.getChannel().map(MapMode.READ_WRITE, inC.position(), length);
inC.position(b.length + inC.position());
outC.put(b);
outC.force();
out.close();
in.close();
}
}
JButton btnCopy = null;
JTextField txtDest = null;
JTextField txtSrc = null;
JList fileList = null;
JButton btnLoad = null;
JButton btnClear = null;
}