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);
    }

}