注:文中使用部分方法请参考[url=http://schiz.iteye.com/blog/690707]《对Java IO的一些总结 (1) 》[/url]
移动文件和目录的关键技术如下:
1. File的renameTo方法能移动文件。
2. 当目标文件存在,或者目标的父目录不存在时,renameTo方法返回false。
复制文件和目录的关键技术点如下:
1. FileInputStream类是文件输入流,根据文件路径可以构造一个FileInputStream对象。
2. FileInputStream的read实例方法从文件输入流中读取数据,即读取文件内容。
3. FileOutputStream类是文件输出流,根据文件路径可以构造一个FileOutputStream对象。
4. FileOutputStream的write实例方法将数据写入到输出流中,即往文件中写内容。
5. 读写文件结束后,需要关闭文件输入、输出流。
移动文件和目录的关键技术如下:
1. File的renameTo方法能移动文件。
2. 当目标文件存在,或者目标的父目录不存在时,renameTo方法返回false。
/**
* 移动单个文件
* @param srcFileName 待移动的源文件名
* @param targetFileName 目标文件名
* @param overlay 如果目标文件存在,是否覆盖
* @return 文件移动成功返回true,否则返回false
*/
public static boolean moveFile(String srcFileName, String targetFileName, boolean overlay) {
File srcFile = new File(srcFileName);
if (!srcFile.exists()) {
System.out.println("The \"" + srcFileName + "\" is not exists.");
return false;
} else if (!srcFile.isFile()) {
System.out.println("The \"" + srcFileName + "\" is not an file.");
return false;
}
File tarFile = new File(targetFileName);
if (tarFile.exists()) { //目标文件存在
// 如果允许文件覆盖
if (overlay) {
if (!delete(targetFileName)) {
System.out.println("Delete target file \"" + targetFileName + "\" fail.");
return false;
}
} else {
System.out.println("Target file \"" + targetFileName + "\" already exists.");
return false;
}
} else { //目标文件所在的目录不存在,则创建目录
if (!tarFile.getParentFile().exists()) {
if (!tarFile.getParentFile().mkdirs()) {
System.out.println("Create directory of file \"" + targetFileName + "\" fail.");
return false;
}
}
}
// 移动源文件至目标文件
if (srcFile.renameTo(tarFile)) {
System.out.println("Move file \"" + srcFileName + "\" to \"" + targetFileName + "\" success.");
return true;
} else {
System.out.println("Move file \"" + srcFileName + "\" to \"" + targetFileName + "\" fail.");
return false;
}
}
/**
* 移动目录
* @param srcDirName 待移动的源目录名
* @param tarDirName 目标目录名
* @param ovelay 如果目标目录存在,是否覆盖
* @return 目录移动成功返回true,否则返回false
*/
public static boolean moveDirectory(String srcDirName, String tarDirName, boolean overlay) {
File srcDir = new File(srcDirName);
if (!srcDir.exists()) {
System.out.println("The \"" + srcDirName + "\" not exists.");
return false;
} else if (!srcDir.isDirectory()) {
System.out.println("The \"" + srcDirName + "\" is not an directory.");
return false;
}
// 如果目标文件夹名不是以文件分隔符结尾,自动添加文件分隔符
if (!tarDirName.endsWith(File.separator)) {
tarDirName = tarDirName + File.separator;
}
File tarDir = new File(tarDirName);
// 如果目标文件存在
if (tarDir.exists()) {
if (overlay) {
// 允许覆盖则删除已存在的目标目录
if (!delete(tarDirName)) {
System.out.println("Delete target directory \"" + tarDirName + "\" fail.");
return false;
} else {
System.out.println("Target directory \"" + tarDirName + "\" already exists.");
return false;
}
}
} else {
// 创建目标目录
if (!tarDir.mkdirs()) {
System.out.println("Create directory \"" + tarDirName + "\" fail.");
return false;
}
}
boolean flag = true;
// 移动源目录下的文件和子目录到目标目录下
File[] files = srcDir.listFiles();
for (int i = 0; i < files.length; i++) {
// 移动子文件
if (files[i].isFile()) {
flag = moveFile(files[i].getAbsolutePath(),
tarDirName + files[i].getName(), overlay);
if (!flag) {
break;
}
} else if (files[i].isDirectory()) {// 移动子目录
flag = moveDirectory(files[i].getAbsolutePath(),
tarDirName + files[i].getName(), overlay);
if (!flag) {
break;
}
}
}
if (!flag) {
System.out.println("Move directory \"" + srcDirName + "\" to \"" + tarDirName + "\" fail.");
return false;
}
// 删除原目录
if (deleteDir(srcDirName)) {
System.out.println("Move directory \"" + srcDirName + "\" to \"" + tarDirName + "\" success.");
return true;
} else {
System.out.println("Move directory \"" + srcDirName + "\" to \"" + tarDirName + "\" fail.");
return false;
}
}
复制文件和目录的关键技术点如下:
1. FileInputStream类是文件输入流,根据文件路径可以构造一个FileInputStream对象。
2. FileInputStream的read实例方法从文件输入流中读取数据,即读取文件内容。
3. FileOutputStream类是文件输出流,根据文件路径可以构造一个FileOutputStream对象。
4. FileOutputStream的write实例方法将数据写入到输出流中,即往文件中写内容。
5. 读写文件结束后,需要关闭文件输入、输出流。
/**
* 复制单个文件
* @param srcFileName 待复制的文件名
* @param tarFileName 目标文件名
* @param overlay 如果目标文件存在是否覆盖
* @return 如果复制成功返回true,否则返回false
*/
public static boolean copyFile(String srcFileName, String tarFileName, boolean overlay) {
//判断源文件是否存在
File srcFile = new File(srcFileName);
if (!srcFile.exists()) {
System.out.println("The \"" + srcFileName + "\" is not exists.");
return false;
} else if (!srcFile.isFile()) {
System.out.println("The \"" + srcFileName + "\" is not an file.");
return false;
}
//判断目标文件是否存在
File tarFile = new File(tarFileName);
if (tarFile.exists()) { //如果目标文件存在,而且复制时允许覆盖
if (overlay) {
//删除已存在的目标文件,无论目标文件是目录还是单个文件
if (!delete(tarFileName)) {
System.out.println("Delete target file \"" + tarFileName + "\" fail.");
return false;
}
} else {
System.out.println("Target file \"" + tarFileName + "\" already exists.");
return false;
}
} else { //如果目标文件存在,查看其所在目录是否存在
if (!tarFile.getParentFile().exists()) { //如果目标文件所在的目录不存在,则创建目录
if (!tarFile.getParentFile().mkdirs()) {
System.out.println("Create directory of file \"" + tarFileName + "\" fail.");
return false;
}
}
}
int byteread = 0; //读取的字节数
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(srcFile);
out = new FileOutputStream(tarFile);
byte[] buffer = new byte[1024];
//一次读取1024个字节,当byteread为-1时表示文件已经读完
while ((byteread = in.read(buffer)) != -1) {
out.write(buffer, 0, byteread); //将读取的字节流写入输出流
}
System.out.println("Copy file \"" + srcFileName + "\" to \"" + tarFileName + "\" success.");
return true;
} catch (Exception e) {
System.out.println("Copy file \"" + srcFileName + "\" to \"" + tarFileName + "\" fail."
+ "\"n" + e.getMessage());
return false;
} finally { //关闭输入输出流,注意先关闭输出流,再关闭输入流
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 复制整个目录的内容
* @param srcDirName 待复制的目录名
* @param tarDirName 目标目录名
* @param overlay 如果目标文件存在,是否覆盖
* @return 如果复制成功返回true,否则返回flase
*/
public static boolean copyDirectory(String srcDirName, String tarDirName, boolean overlay) {
// 判断源目录是否存在
File srcDir = new File(srcDirName);
if (!srcDir.exists()) {
System.out.println("The \"" + srcDir + "\" is not exists.");
return false;
} else if (!srcDir.isDirectory()) {
System.out.println("The \"" + srcDir + "\" is not an directory.");
return false;
}
if (!tarDirName.endsWith(File.separator)) {
tarDirName = tarDirName + File.separator;
}
File tarDir = new File(tarDirName);
if (tarDir.exists()) {
if (overlay) {
if (!delete(tarDirName)) {
System.out.println("Delete target directory \"" + tarDirName + "\" fail.");
return false;
}
} else {
System.out.println("Target directory \"" + tarDirName + "\" already exists.");
return false;
}
}
boolean flag = true;
File[] files = srcDir.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
flag = copyFile(files[i]
.getAbsolutePath(), tarDirName + files[i].getName());
if (!flag) {
break;
}
}
if (files[i].isDirectory()) {
flag = copyDirectory(files[i]
.getAbsolutePath(), tarDirName + files[i].getName());
if (!flag) {
break;
}
}
}
if (!flag) {
System.out.println("Copy directory \"" + srcDirName + "\" to \"" + tarDirName + "\" fail.");
return false;
}
System.out.println("Copy directory \"" + srcDirName + "\" to \"" + tarDirName + "\" success.");
return true;
}