Java拷贝文件到对应的路径

最近发现公司部署项目上去的时候仅需要针对个别的class文件或者其他个别的文件进行覆盖就行。每次都觉得手动找路径而且又要找文件很麻烦。所以写了一个copy文件的代码出来。

输入对应的Java文件路径:C:UsersAdministratorWorkspacesMyEclipse 10springmvc01srccomdto okenWeiXinQRCode.java 代码会自动去寻找对应的class文件

代码如下  

package com.weipan.api.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author jim weng
 * @version 1.0.3
 * @date 2016-6-7
 * **/
public class CopyFileToBaibei {

	private static File fils;
	// 允许复制的文件类型
	public static String[] filterFile = { ".jks", ".js", ".jsp", ".class",
			".java", ".xml", ".properties", ".sql" };
	private static long total = 0l;
	// private static Pattern pattern =
	// Pattern.compile("[A-z][:]/[A-z]*/OMC[0-9A-z]{0,}");
	private static List<String> l = new ArrayList<String>();;
	// 0 将Java 替换为class
	// 1 位url
	// 2 识别号 为0的时候。是添加classes 下的配置文件
	// 3 对应的路径
	static String[] string = new String[4];
	// 创建指派的路径
	private final static String clPth = "WebRoot\WEB-INF\classes\";

	// private final static String clPth2 = "WebRoot\WEB-INF\";

	public static void main(String[] args) throws Exception {
		// 读取文本信息
		getFile(readTxtFile("d:\test2.txt"));
	}

	/**
	 * @param k
	 *            path
	 **/
	private static void getFile(List<String> k) throws IOException, Exception {
		for (String string : k) {
			// System.out.println(string);
			if ("".equals(string) || string == null) {
				throw new IOException("请确认文件是否存在");
			}
			String[] p = getFile(string, 0);
			String classPath = "";
			for (int i = l.size(); i > 0; i--) {
				classPath += l.get(i - 1) + "\";
			}
			String classp = "";
			// 背拷贝的数据 指定时间数据
			String df = new SimpleDateFormat("YYYYMMdd").format(new Date());
			File des = null;
			if ("".equals(classPath)) {
				// string [2] 为0的时候。是添加classes 下的配置文件
				if (p[2].equals("0")) {
					classp = p[1] + clPth;
					des = new File("D:\java\" + df + "\" + clPth);
				} else {
					classp = p[1];
					if (p[3].indexOf("conf") != -1) {
						des = new File("D:\java\" + df + "\" + clPth
								+ p[3].substring(p[3].indexOf("conf") + 4));
					} else {

						des = new File("D:\java\" + df + "\" + p[3]);
					}
				}

			} else {
				classp = p[1] + clPth + classPath;
				des = new File("D:\java\" + df + "\" + clPth + classPath);
			}
			/*
			 * System.out.println("clPth:" + clPth);
			 * System.out.println("classPath:" + classPath);
			 * System.out.println("classp:" + classp);
			 */
			// 需要拷贝的数据
			File src = new File(classp.replace("\", "\\"));
			// filterFile=new String []{p[0]};
			new CopyFileToBaibei().copyFolder(src, des, filterFile, p[0]);
			// 重置
			l = new ArrayList<String>();
		}
	}

	/**
	 * 读取文本数据
	 * **/
	public static List<String> readTxtFile(String filePath) {
		List<String> l = new ArrayList<String>();
		try {
			String encoding = "UTF-8";
			File file = new File(filePath);
			// System.out.println(filePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), encoding);// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				while ((lineTxt = bufferedReader.readLine()) != null) {
					// System.out.println(lineTxt.replace("\", "\\"));
					l.add(lineTxt.replace("\", "\\"));
				}
				read.close();
			} else {
				System.out.println("找不到指定的文件");
			}
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
			e.printStackTrace();
		}
		return l;
	}

	/**
	 * @param path
	 *            讀文檔路径
	 * @param flag
	 *            标识符
	 * **/

	private static String[] getFile(String path, int flag) {
		fils = new File(path);
		// System.out.println("path:"+path);
		if (fils.isFile()) {
			// System.out.println("fils:"+fils.getName());
			string[0] = fils.getName().replace("java", "class");
		} else {
			// 文件夹名字
			if (!"src".equals(fils.getName())) {
				l.add(fils.getName());
			}

			if ("".equals(fils.getName())) {
				l.add("classes");
			}
		}
		if (fils.getParent().lastIndexOf("src") != -1) {
			path = fils.getParent();
			if ((path.lastIndexOf("src") + 3) != path.length()) {
				return getFile(path, 0);
			} else if ((path.lastIndexOf("src")) <= path.length()) {
				return getFile(path, 1);
			}
		}
		if (flag == 1) {
			// D:springmvc
			string[1] = path.substring(0, path.lastIndexOf("src")).replace(
					"src", "");
			string[2] = "0";
		} else {

			// System.out.println(path);
			if (path.lastIndexOf("src") > -1) {
				string[1] = path.substring(0, path.lastIndexOf("src"));
			} else {

				// /D:\springmvc01\WebRoot\WEB-INF\index.jsp
				string[1] = path.replace(string[0], "");
			}
			string[2] = "";

			// 针对spring mvc 配置的conf 文件 需要copy到classes文件下
			if (path.indexOf("WebRoot") == -1) {

				// System.out.println(
				// path.substring(path.indexOf("conf"),path.indexOf(string[0])));
				string[3] = path.substring(path.indexOf("conf"),
						path.indexOf(string[0]));
			} else {

				string[3] = path.substring(path.indexOf("WebRoot"),
						path.indexOf(string[0]));
			}

		}

		return string;
		/*
		 * for (int i = 0; i < fils.listFiles().length; i++) { for (File file :
		 * fils.listFiles()) { //如果不是目录,直接添加 if (!file.isDirectory()) {
		 * System.out.println(file.getAbsolutePath()); } else {
		 * System.out.println(fils.getAbsolutePath()); //对于目录文件,递归调用
		 * getFile(file.getAbsolutePath()); } } }
		 */
	}

	/**
	 * 
	 * @param folder
	 * @param filterFile
	 * @param fileName
	 * @throws Exception
	 */
	public void copyFolder(File srcFolder, File destFolder,
			String[] filterFile, String fname) throws Exception {
		File[] files = srcFolder.listFiles();
		// System.out.println(destFolder);
		// 先删除旧文件 創建目錄
		// deleteDir(destFolder);
		destFolder.mkdirs();

		for (File file : files) {
			if (file.isFile()) {
				String vl=file.getName().substring(file.getName().lastIndexOf("\")+1,file.getName().length()).replace(".class", "");
	//			System.out.println("vl:"+vl);
				if (vl.equals(fname.replace(".class", ""))||vl.indexOf(fname.replace(".class", "")+"$")==0) {
					 System.out.println("test:"+file.getName());
					String pathname = destFolder + File.separator
							+ file.getName();
					for (String suff : filterFile) {
						if (pathname.endsWith(suff)) {
							File dest = new File(pathname);
							File destPar = dest.getParentFile();
							destPar.mkdirs();
							if (!dest.exists()) {
								dest.createNewFile();
							}
							// D:springmvcWebRootWEB-INFindex.jsp
							// D:java20160603WebRootindex.jsp
							// 为了防止重命名并且不在同一个路径下COPY
							if ((file.getParent()
									.substring(file.getParent().length() - 4,
											file.getParent().length() - 1)
									.equals(dest.getParent().substring(
											dest.getParent().length() - 4,
											dest.getParent().length() - 1)))||file.getParent().contains("conf")) {
								if (file.length() == 0) {
									throw new IOException("文件不允许为空"
											+ ",需要处理的文件为:" + file.getParent()
											+ "\" + file.getName());
								}
								copyFile(file, dest);
							}

						}
					}
				}
			} else {
				copyFolder(file, destFolder, filterFile, fname);
			}
		}
	}

	/***
	 * copy file
	 * 
	 * @param src
	 * @param dest
	 * @throws IOException
	 */
	private void copyFile(File src, File dest) throws Exception {
		BufferedInputStream reader = null;
		BufferedOutputStream writer = null;

		try {
			reader = new BufferedInputStream(new FileInputStream(src));
			writer = new BufferedOutputStream(new FileOutputStream(dest));
			byte[] buff = new byte[reader.available()];
			while ((reader.read(buff)) != -1) {
				writer.write(buff);
			}
			total += 1;
		} catch (Exception e) {
			throw e;
		} finally {
			writer.flush();
			writer.close();
			reader.close();
			// 记录
			String temp = "
copy:
" + src + "	size:" + src.length()
					+ "
to:
" + dest + "	size:" + dest.length()
					+ "
 complate
 totoal:" + total;
			System.out.println(temp);
		}
	}

	/**
	 * 递归删除目录下的所有文件及子目录下所有文件
	 * 
	 * @param dir
	 *            将要删除的文件目录 暂时还没用
	 */
	private static boolean deleteDir(File dir) {
		if (dir.isDirectory()) {
			String[] children = dir.list();

			for (int i = 0; i < children.length; i++) {
				boolean success = deleteDir(new File(dir, children[i]));
				if (!success) {
					return false;
				}
			}
		}
		// 目录此时为空,可以删除
		return dir.delete();
	}
}

  

 

原文地址:https://www.cnblogs.com/jimw/p/5557917.html