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