文件操作还是那么四个步骤,
1,建立俩联系
2,选择流
3,操作
4,释放资源
拷贝文件夹的时候,得考虑如果是 递归把文件夹下的所有文件都给拷贝到目标目录下,是文件则直接拷贝,是目录则创建,很显然得用到递归,代码如下:
/**
* 操作文件过程 1,建立联系 2,选择流 3,操作,读写 4,释放资源
*
* @author snow
*
*/
public class IODemo {
// 为了代码一目了然,这里使用抛出异常,统一处理
public static void main(String[] args) throws Exception {
copyDir("D:/xunlei", "D:/xunlei2");
}
/**
* copy dir or file
* @param src 源路径
* @param dest 目标路径
* @throws Exception
*/
public static void copyDir(String src, String dest) throws Exception {
File srcFile = new File(src);
File destFile = new File(dest);
copyDir(srcFile, destFile);
}
/**
* copy dir or file
* @param src 源file对象
* @param dest 目标file对象
* @throws Exception
*/
public static void copyDir(File src,File dest) throws Exception {
if(src.isDirectory()) {
dest = new File(dest, src.getName());
}
copyFileDetil(src, dest);
}
/**
* 拷贝文件细节
* @param src
* @param dest
* @throws Exception
*/
public static void copyFileDetil(File src, File dest) throws Exception {
// 如果是文件直接拷贝
if(src.isFile()) {
copyFile(src, dest);
}
if(src.isDirectory()) {
// 如果是目录则直接创建
dest.mkdirs();
//获取下一级目录|文件
for (File sub : src.listFiles()) {
copyFileDetil( sub , new File(dest,sub.getName()) );
}
}
}
/**
* 拷贝文件
* @param src 源文件对象
* @param dest 目标文件对象
*/
public static void copyFile(File inFile,File outFile) throws Exception {
if(!inFile.exists()) {
throw new Exception("源文件不存在!");
}
// 建立输入输出流
InputStream is = new FileInputStream(inFile);
OutputStream os = new FileOutputStream(outFile);
// 如果目录不存在则创建
if( ! new File(outFile.getPath()).exists() ) {
new File(outFile.getPath()).mkdirs();
}
// 设置缓冲区
byte[] b = new byte[4096];
// 记录实际读取长度
int len = 0;
while (-1 != (len = is.read(b))) {
// 输出(写入到磁盘)
os.write(b, 0, len);
}
// 强制输入所有读取的字节
os.flush();
// 释放资源 先打开的后关闭
os.close();
is.close();
}