学习Java小结-1
学习Java也有近一个月了,基础语法、常用类也有所了解。上周把文件相关操作进行了一个总结,制作了一个简单的文件常用操作的工具类。此处详解文件的拷贝与移动
工具类包含了容下功能的实现:
1、 拷贝文件
2、 移动文件
3、 遍历文件夹
4、 获取文件夹内所有文件
5、 文件打包与解包
下面来看一下功能的具体实现
1、拷贝文件
思路:将源文件的内容读取到内存中,然后在写入到目标文件中即可
由于要实现任意文件的拷贝,选用Java二进制输入(DataInputStream)输出(DataOutputStream)流,还要支持任意大小的文件的拷贝,因此采用缓冲循环读取写入方式。具体看代码:
/*** 文件拷贝
*
* @param srcFile
* 源文件绝对路径的文件对象
* @param destFile
* 目标文件绝对路径的文件对象
* @return 成功拷贝返回true,否则为false
*/
public static boolean copyFile(File srcFile, File destFile) {
//文件拷贝结果
boolean flag = false;
//判断一下源文件是否存在,增加方法的安全性
if (srcFile.exists()) {
try {
//假如源文件是一个目录,则直接创建目录,仅支持文件的拷贝
if (!srcFile.isDirectory()) {
//创建目标文件的父级目录
destFile.getParentFile().mkdirs();
//创建文件输入流 绑定源文件
FileInputStream in = new FileInputStream(srcFile);
//创建二进制输入流,支持拷贝任意类型的文件
DataInputStream srcIn = new DataInputStream(in);
//创建对应的输出流、二进制输出流 绑定输出文件
FileOutputStream out = new FileOutputStream(destFile);
DataOutputStream desOut = new DataOutputStream(out);
//因为文件大小不定,使用缓冲方式读入数据。每次最多读取4096byte
//实际读取长度为length
int length = 0;
byte[] readBuffer = new byte[4096];
//循环读取,直到文件末尾 srcIn.read(readBuffer)返回-1
while ((length = srcIn.read(readBuffer)) != -1) {
//安装实际读取长度写入目标文件
desOut.write(readBuffer, 0, length);
}
//刷新输出流,将数据保存到目标文件中
desOut.flush();
//文件拷贝完毕,关闭输出、输入流
desOut.close();
in.close();
srcIn.close();
flag = true;
} else {
destFile.mkdirs();
flag = true;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println(srcFile.getAbsolutePath() + "不存在");
}
return flag;
}
2、文件移动
思路:将源文件内容读取到内存中,写入目标文件后删除源文件
在功能1的基础上实现源文件的删除即可。注:此方法仅能移动空文件夹
/**
* 移动文件
*
* @param srcFile
* 源文件绝对路径的文件对象
* @param destFile
* 目标文件绝对路径的文件对象
* @return 成功移动返回true,否则为false
*/
public static boolean moveFile(File srcFile, File destFile) {
//调用已经实现的文件拷贝方法
boolean flag = copyFile(srcFile, destFile);
//如果已经成功拷贝文件,则删除源文件
if (flag) {
srcFile.delete();
}
return flag;
}