本帖最后由 王志明 于 2012-7-27 13:49 编辑
我前几天刚写过这道题,我定义了两个工具类,一个复制文件,一个过滤文件,而且灵活性也很好,可以通过参数定制来达到不同的目的:
- package com.itheima;
- import com.itheima.util.IOUtils;
- /**
- * 将d:\java 目录下的所有.java 文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad
- *
- * @author mrng
- *
- */
- public class Test9 {
- 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();
- }
- }
- }
- }
复制代码 |