`

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

 
阅读更多

 

------- 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/
分享到:
评论

相关推荐

    黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心

    黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心

    黑马程序员-SpringCloud-学习笔记01-认识微服务

    黑马程序员-SpringCloud-学习笔记01-认识微服务

    黑马程序员-Qt讲义.pdf

    手动创建项目涉及到编辑.pro文件,这是一种Qt特有的项目描述文件,用于定义项目的目标、编译规则和资源。一个最简单的Qt应用程序的代码示例也会在教程中给出,帮助新手理解基本的项目结构和运行流程。 Qt的核心机制...

    黑马程序员------类加载器学习注意点

    在Java编程语言中,类加载器(ClassLoader)是至关重要的组成部分,它负责将类的字节码从磁盘、网络或其他存储介质加载到JVM(Java虚拟机)中,并将其转换为可执行的Java对象。类加载器的学习是深入理解Java运行机制...

    黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用

    黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用

    黑马程序员-合并和切割文件

    在这个例子中,我们遍历了`files`列表中的每一个文本文件,读取每一行内容并写入到名为`merged.txt`的新文件中。最后,我们打印出合并后文件的内容以确认合并成功。 接下来,我们讨论“切割文件”。文件切割通常...

    黑马程序员-java32期培训视频(基础+就业)

    黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)

    黑马程序员---注解归纳

    通过阅读《黑马程序员---注解归纳》这篇博客,你将能够深入理解注解的工作原理,学习如何利用注解提升代码质量,并掌握在不同场景下使用注解的最佳实践。同时,配合提供的`annotation.txt`文件,你可能能获取到更多...

    黑马程序员 - 毕向东 - Java基础教学 - 第02天

    黑马程序员 - 毕向东 - Java基础教学 - 第02天 个人观看视频总结文档

    黑马程序员 - 毕向东 - Java基础教学 - 第01天

    黑马程序员 - 毕向东 - Java基础教学 - 第01天 个人观看视频总结文档

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 ...

    黑马程序员-tomcat集群部署文档资料

    总结,"黑马程序员-tomcat集群部署文档资料"涵盖的范围广泛,从基础的集群概念和原理,到具体的Tomcat集群配置和优化,再到高级的源码分析,对于希望提升服务器管理和运维能力的IT从业者来说是一份宝贵的参考资料。...

    黑马程序员-java多线程技术01

    本教程将聚焦于Java中的多线程技术,以“黑马程序员-java多线程技术01”为学习起点,探讨如何在Java中实现并管理线程。 首先,我们来理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个...

    黑马程序员-----javaBean的操作类学习笔记

    - JavaBean可以通过`PropertyUtils`或`BeanUtils`类(来自Apache Commons BeanUtils库)进行便捷的属性读写,例如`BeanUtils.copyProperties(destBean, srcBean)`可以复制一个bean的所有属性到另一个bean。...

    黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc

    在《黑马程序员 - Java基础教学 - 05 - 面向对象(1)》文档中,详细讲解了面向对象的基本概念及其在Java中的应用。 ### 面向对象与面向过程 面向对象和面向过程都是解决问题的思维模式,但面向对象更注重将功能和...

    黑马程序员-毕向东全套Java视屏

    黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。

    黑马程序员-------hash改变造成的内存泄露

    标题“黑马程序员------hash改变造成的内存泄露”提示我们,这个问题与哈希值的变化有关,这可能会导致程序无法正确地释放不再使用的内存,从而影响系统性能。下面我们将深入探讨这个话题。 哈希(Hash)通常指的是...

    黑马程序员----泛型学习注意点

    黑马程序员提供的这篇关于泛型的学习注意点,结合了源码分析和工具应用,旨在帮助开发者深入理解并有效运用泛型。下面将详细阐述泛型的主要知识点: 1. 泛型的基本概念: 泛型是Java SE 5.0引入的新特性,主要用于...

    黑马程序员Qt全解教程.zip

    黑马程序员Qt入门教程的相关文档。1 Qt概述 3 1.1 什么是Qt 3 1.2 Qt的发展史 4 1.3 支持的平台 4 1.4 Qt版本 4 1.5 Qt的安装 5 Linux Host 5 OS X Host 5 Windows Host 5 1.6 Qt的优点 5 2 创建Qt项目 6 2.1 使用...

Global site tag (gtag.js) - Google Analytics