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