黑马程序员-将指定目录下的文件复制到指定的目录,并更改扩展名

 

------- android培训java培训、期待与您交流! ----------
d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad
package com.itheima;

import com.itheima.util.IOUtils;

/**
 * 将d:\java 目录下的所有.java 文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad
 * 
 * @author mrng
 * 
 */
public class TestCopy {

	public static void main(String[] args) throws Exception {

		/**
		 * copyFilesAndChangeExtension(String srcDir, String extension, String
		 * destDir, String newExtension, boolean searchSubDir)
		 * 这个方法提供了强大的文件复制功能,通过不同的参数组合,可以达到各种效果
		 * 
		 * srcDir指定要复制的目录 extension指定要复制的文件的扩展类型,如果不指定(""或null),将会复制指定目录下的所有文件
		 * 还可以使用排除法(使用"!")过滤文件,比如,extension 的值为"!.java",那么除了".java"文件,其它的文件都将复制
		 * destDir指定目的地目录 
		 * searchSubDir指定是否对指定目录的子孙目录下的文件也进行复制
		 * 
		 */

		String srcDir = "src/com/itheima";
		String destDir = "src/copyFiles";

		//将xxx目录下的所有.java 文件复制到xxx目录下,并将原来文件的扩展名从.java 改为.jad
		IOUtils.copyFilesAndChangeExtension(srcDir, ".java",
				destDir, ".jad", false);
	}
}

 

 

package com.itheima.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * IO 工具类
 * 
 * @author mrng
 * 
 */
public class IOUtils {

	/**
	 * 将指定文件拷贝到目的地 这里采用的是基础流(FileinputStream,FileOutputStream)+byte数组(缓冲区)实现
	 * 当然也可以使用包装流(Buffered....)
	 * 
	 * @param src
	 *            将要拷贝的文件
	 * @param dest
	 *            将文件要保存到的目标目录
	 * 
	 */
	public static void copy(String src, String dest) {
		copy(src, dest, null);
	}

	/**
	 * copy(String src, String dest)的重载形式,可以更改文件扩展名
	 * 
	 * @param src
	 * @param dest
	 * @param newExtension
	 */
	public static void copy(String src, String dest, String newExtension) {
		File srcFile = new File(src);
		// 如果文件不存在或是一个目录,抛出异常
		if (!srcFile.exists() || srcFile.isDirectory())
			throw new RuntimeException("文件不存在");

		File destDir = new File(dest);
		// 如果目标目录不存在,则创建
		if (!destDir.exists()) {
			destDir.mkdirs();
		} else {
			// 如果是文件,抛出异常
			if (destDir.isFile()) {
				throw new RuntimeException("您指定的目的地是一个文件,请重新指定目录");
			}
		}

		// 代表目标文件的完整路劲信息的对象
		File destFile = null;
		System.out.println();
		// 判断要不要改变文件的扩展名
		if (newExtension == null || newExtension.trim().equals("")) {
			// 不改变文件扩展名
			destFile = new File(dest + "/" + srcFile.getName());
		} else {
			// 改变文件扩展名
			// 如果文件没有扩展名,直接加上新的扩展名
			if (getExtension(srcFile.getPath()).equals("")) {
				destFile = new File(dest + "/" + srcFile.getName()
						+ newExtension);
			} else {
				// 如果文件有扩展名,替换为新的扩展名
				String newFilename = srcFile.getName();
				newFilename = newFilename.substring(0,
						newFilename.lastIndexOf("."))
						+ newExtension;
				destFile = new File(dest + "/" + newFilename);
			}
		}

		InputStream is = null;
		OutputStream os = null;

		// 存放文件片段的缓冲区
		byte[] buf = new byte[1024 * 8];
		// 记录每次读取了多少byte数据
		int len;
		try {
			is = new FileInputStream(srcFile);
			os = new FileOutputStream(destFile);

			// 循环读取数据并写入到输出流
			while ((len = is.read(buf)) != -1) {
				os.write(buf, 0, len);
			}

			System.out.println("拷贝成功!");
			System.out.println("文件\"" + srcFile.getName() + "\n\"已从\""
					+ srcFile.getAbsolutePath() + "\n拷贝到\""
					+ destFile.getAbsolutePath() + "\"");
		} catch (IOException e) {
			throw new RuntimeException("文件拷贝出现错误,请重试!");
		} finally {
			// 关闭流
			close(is, os);
		}
	}

	/**
	 * 获得文件的扩展名
	 * 
	 * @param filePath
	 * @return
	 */
	public static String getExtension(String filePath) {
		File file = new File(filePath);
		// 如果文件不存在,抛出异常
		if (!file.exists())
			throw new RuntimeException("文件不存在");

		// 得到文件名
		String fileName = file.getName();
		// 找出属于扩展名的那个“.”
		int index = fileName.lastIndexOf(".");
		// 如果文件没有扩展名,返回""
		if (index < 1) {
			return "";
		}
		// 截取扩展名部分
		String extension = fileName.substring(index, fileName.length());
		return extension;
	}

	/**
	 * 将指定目录下的文件(指定扩展名)复制到指定目录(可以更改扩展名)
	 * 
	 * @param srcDir
	 *            源目录
	 * @param extension
	 *            要复制的文件的扩展名,如果不指定,就代表所有文件
	 * @param destDir
	 *            目标目录
	 * @param newExtension
	 *            新的扩展名
	 * @param searchSubDir
	 *            是否对指定的源目录下的子目录也执行相同的操作
	 */
	public static void copyFilesAndChangeExtension(String srcDir,
			String extension, String destDir, String newExtension,
			boolean searchSubDir) {

		File srcFile = new File(srcDir);
		// 如果目录不存在或不是一个目录,抛出异常
		if (!srcFile.exists() || !srcFile.isDirectory())
			throw new RuntimeException("目录不存在");

		File newDestDir = new File(destDir);
		// 如果目标目录不存在,则创建
		if (!newDestDir.exists()) {
			newDestDir.mkdirs();
		} else {
			// 如果是文件,抛出异常
			if (newDestDir.isFile()) {
				throw new RuntimeException("您指定的目的地是一个文件,请重新指定目录");
			}
		}

		// 文件清单
		List<File> fileList = new ArrayList<File>();
		// 获取指定目录的文件清单
		getDirList(fileList, srcFile, extension, searchSubDir,
				new MyFilenameFilter());

		// 复制文件并更改扩展名
		for (File fiel : fileList) {
			copy(fiel.getPath(), newDestDir.getPath(), newExtension);
		}
	}

	/**
	 * 获得指定目录的文件清单
	 * 
	 * @param fileList
	 *            保存文件清单的集合
	 * @param file
	 *            要获取文件清单的目录
	 * @param extension
	 *            扩展名,如果不指定,就代表所有文件
	 * @param searchSubDir
	 *            是否查找指定目录的子目录
	 * @param fileanmeFilter
	 *            文件名过率器
	 * @return 返回指定目录的文件清单
	 */
	public static void getDirList(List<File> fileList, File file,
			String extension, boolean searchSubDir,
			FilenameFilter fileanmeFilter) {

		getDirList(fileList, file, extension, searchSubDir,
				new MyFilenameFilter(), 0);
	}

	/**
	 * getDirList(List<File> fileList, File file, String extension, boolean
	 * searchSubDir, FilenameFilter fileanmeFilter) 的重载形式,多了一个功能性参数
	 * 
	 * @param level
	 *            记录目录层级
	 */
	private static void getDirList(List<File> fileList, File file,
			String extension, boolean searchSubDir,
			FilenameFilter fileanmeFilter, int level) {
		//目录层级+1
		level ++;

		// 如果file是目录就遍历
		if (file.isDirectory()) {
			File[] files = file.listFiles();

			if (files == null || files.length == 0) {
				return;
			}

			// 如果需要查找指定目录的子目录,就递归
			if (level == 1 || searchSubDir == true) {
				for (File f : files) {
					getDirList(fileList, f, extension, searchSubDir,
							fileanmeFilter);
				}
			}
		} else if (file.isFile()) {
			// 如果是文件并且extension已指定,就对其进行过滤
			if (extension != null && !extension.trim().equals("")) {
				if (fileanmeFilter.accept(file, extension)) {
					fileList.add(file);
				}
			} else {
				// 如果没有指定extension,不进行过滤
				fileList.add(file);
			}
		}
	}

	/**
	 * 关闭流
	 */
	private static void close(InputStream is, OutputStream os) {
		// 关闭流,如果关闭不成功,将流对象置为null
		if (is != null) {
			try {
				is.close();
			} catch (IOException e) {
				is = null;
				e.printStackTrace();
			}
		}

		// 关闭流,如果关闭不成功,将流对象置为null
		if (os != null) {
			try {
				is = null;
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

 

 

package com.itheima.util;

import java.io.File;
import java.io.FilenameFilter;

/**
 * 此类可以根据扩展名过滤文件
 * 
 * @author mrng
 * 
 */
public class MyFilenameFilter implements FilenameFilter {

	/**
	 * 对指定文件进行过滤
	 * 
	 * @param file
	 *            指定的文件
	 * 
	 * @param extension
	 *            要过滤的扩展名 此参数有两种用法: 
	 *            1,比如".java",如果文件扩展名为".java",返回true
	 *            2,比如"!.java",如果文件扩展名不是".java",则返回true 
	 */
	public boolean accept(File file, String extension) {

		// file==null直接返回false
		// 如果extension为null或"",那么调用这个方法没无意义了,返回false
		// 如果file不存在或是一个目录,返回false
		if (file == null || extension == null || "".equals(extension.trim())
				|| !file.exists() || file.isDirectory()) {
			return false;
		}

		// 获得文件的扩展名
		String fileExtension = IOUtils.getExtension(file.getPath());
		 if (extension.startsWith("!")) {
			if (fileExtension.equals(extension.substring(1))) {
				return false;
			}
			return true;
		} else {
			if (fileExtension.equals(extension)) {
				return true;
			}
			return false;
		}
	}
}
 
------- android培训java培训、期待与您交流! ----------
详细请查看: http://edu.csdn.net/heima/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值