JAVA中没有提供特定的文件拷贝方法,但可以通过文件输入输出流对文件进行逐字节拷贝。
而在编写代码时,要处理以下几个异常:
1.如果拷贝的源文件不存在。
2.源文件和目标文件的类型不同(也就是扩展名不同),将导致源文件和目标文件的内容不一致。
3.在读写文件时,可能会发生异常。

下面是一个自定的文件拷贝类的例子。

import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import javax.swing.JOptionPane;

/**
 *程  序:文件拷贝
 *文件名:FileCopy
 *平 台:windows 2000
 *编译器:JDK1.5.0
 *描 述:该类是抽象类,通过调用方法copy对两个同类型文件进行拷贝
 *   参 数:目标文件名,源文件名。
 **/


public abstract class FileCopy {

    /*拷贝文件*/
    public static boolean copy(String resultFile, final String sourceFile) {
        boolean isCopy = false;
        //判断目标文件名和源文件名类型是否相同(即扩展名是否相同)
        if (!isEqualsType(resultFile, sourceFile)) {
            JOptionPane.showMessageDialog(null, "目标文件和源文件的类型不同,不能拷贝!");
            return false;
        } else {
            //类型相同
            File readFile = new File(sourceFile);
            File writeFile = new File(resultFile);

            //判断源文件是否存在
            if (readFile.exists() && readFile.isFile()) {
                //如果目标文件已经存在,询问是否覆盖
                if (writeFile.exists()) {
                    int state = JOptionPane.showConfirmDialog(null,
                            "目标文件" + resultFile + "已经存在,是否覆盖?");
                    if (state != JOptionPane.YES_OPTION) {
                        return false;
                    }
                }
                FileInputStream readStream = null;
                FileOutputStream writeStream = null;
                try {
                    readStream = new FileInputStream(readFile);
                    writeStream = new FileOutputStream(writeFile);
                    while (readStream.available() > 0) {
                        int content = readStream.read();
                        writeStream.write(content);
                    }
                    JOptionPane.showMessageDialog(null, "文件拷贝成功!");
                    isCopy = true;
                } catch (IOException ioErr) {
                    JOptionPane.showMessageDialog(null, "源文件读取错误!请检查文件");
                } catch (Exception err) {
                    JOptionPane.showMessageDialog(null, "文件拷贝错误!请检查目标文件内容是否正确!");
                } finally {
                    try {
                        readStream.close();
                        writeStream.close();
                    } catch (IOException ioErr) {
                        isCopy = false;
                    }
                }
            }
            //不存在,则返回false
            else {
                JOptionPane.showMessageDialog(null, "源文件" + sourceFile + "不存在!");
            }
            return isCopy;
        }
    }

    /**
     *判断目标文件和源文件的类型是否相同
     *即判断扩展名是否相同
     **/
    private static boolean isEqualsType(String resultFile, String sourceFile) {
        int resultDot = resultFile.lastIndexOf('.');
        int sourceDot = sourceFile.lastIndexOf('.');
        String resultType = "";
        String sourceType = "";
        if (resultDot > 0) {
            resultType = resultFile.substring(resultDot + 1, resultFile.length());
        }
        if (sourceDot > 0) {
            sourceType = sourceFile.substring(sourceDot + 1, sourceFile.length());
        }
        return resultType.equals(sourceType);
    }

}