IO之拷贝文件+文件夹(升级版)

文件操作还是那么四个步骤,

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

 

阅读更多
个人分类: javaio
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭