Java文件操作类

阅读更多
package util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.IOUtils;

public class FileUtil {
	public static String getFilePath(String source_filename,
			String pointFilePath) {
		String ext = "";
		String source_filename_no_ext = source_filename;
		if (source_filename.indexOf(".") > 0) {
			ext = source_filename.substring(source_filename.lastIndexOf("."));
			source_filename_no_ext = source_filename.substring(0,
					source_filename.lastIndexOf("."));
		}

		String uploadRefPath = (pointFilePath == null || pointFilePath.trim()
				.length() == 0) ? getSystemTempPath() : pointFilePath;
		if (uploadRefPath != null
				&& !uploadRefPath
						.endsWith(System.getProperty("file.separator"))
				&& !uploadRefPath.endsWith("/")
				&& !uploadRefPath.endsWith("\\")) {
			uploadRefPath += System.getProperty("file.separator");
		}
		String uploadPath = uploadRefPath;
		File uploadDir = new File(uploadPath);
		if (!uploadDir.exists())
			uploadDir.mkdirs();
		Date today = new Date();
		String formatString = "yyyyMMddHHmmss";
		SimpleDateFormat dateformat = new SimpleDateFormat(formatString);
		String filename = source_filename_no_ext + dateformat.format(today);
		for (int i = 0; i < 10000; i++) {
			String real_filename = filename + "_" + i + ext;
			File file = new File(uploadDir, real_filename);
			if (!file.exists()) {
				return uploadRefPath + real_filename;
			}
		}
		return null;
	}

	/**
	 * 获取系统的临时目录
	 * 
	 * @return
	 */
	public static String getSystemTempPath() {
		return System.getProperty("java.io.tmpdir");
	}

	// ~ Methods add by wubing
	// -------------------------------------------------------------

	/**
	 * 获得指定配置文件属性
	 * 
	 * @param fileName
	 *            文件名称
	 * @return Properties 文件中所包含的所有属性
	 * @throws Exception
	 *             读取属性过程中的任何异常
	 */
	public static Properties getProperties(String fileName) throws Exception {
		Properties initProps = new Properties();
		InputStream in = null;

		try {
			in = getInputStream(fileName);
			initProps.load(in);
		} finally {
			try {
				if (in != null) {
					in.close();
				}
			} catch (Exception e) {
			}
		}

		return initProps;
	}

	/**
	 * 获取指定配置文件属性的读取流,读取路径为本类的CLASSLOADER或者父CLASSLOADER
	 * 
	 * @param fileName
	 *            文件名称
	 * 
	 * @return InputStream 该文件所对应的输入流
	 * @throws Exception
	 *             读取输入流过程中的任何异常
	 */
	public static InputStream getInputStream(String fileName) throws Exception {
		return getInputStream(getFile(getFileURL(fileName).getFile()));
	}

	public static InputStream getInputStream(File file) throws Exception {
		return new BufferedInputStream(new FileInputStream(file));
	}

	/**
	 * 根据文件名获取其在应用中的相对路径
	 * 
	 * @param fileName
	 *            文件名
	 * @return URL 文件在应用中的相对路径
	 * @throws Exception
	 *             获取路径过程中的任何异常
	 */
	public static URL getFileURL(String fileName) throws Exception {
		// 从本类CLASSLOADER相应路径中读取文件
		URL fileURL = FileUtil.class.getClassLoader().getResource(fileName);

		if (fileURL == null) {
			FileUtil.class.getClassLoader().getResource("/" + fileName);
		}

		if (fileURL == null) {
			Thread.currentThread().getContextClassLoader()
					.getResource(fileName);
		}

		if (fileURL == null) {
			fileURL = ClassLoader.getSystemResource(fileName);
		}

		if (fileURL == null) {
			fileURL = new File(fileName).toURL();
		}

		return fileURL;
	}

	/**
	 * 保存属性到文件
	 * 
	 * @param fileName
	 *            文件名
	 * @param prop
	 *            需存储的属性
	 * @throws Exception
	 *             存储属性过程中的任何异常
	 */
	public static void setProperties(String fileName, Properties prop)
			throws Exception {
		FileOutputStream fs = null;
		try {
			fs = new FileOutputStream(getFileURL(fileName).getFile());
			prop.store(fs, "store at " + new Date());
		} finally {
			// 关闭流
			IOUtils.closeQuietly(fs);
		}
	}

	/**
	 * 判断是否需要重新LOAD地址配置文件
	 * 
	 * @param fileName
	 *            文件名
	 * @param lastModify
	 *            原最后修改时间
	 * @return boolean 是否需要重新读取
	 * @throws Exception
	 *             判断重新LOAD过程中的任何异常
	 */
	public static boolean needReload(String fileName, long lastModify)
			throws Exception {
		// 判断文件最后更新时间,决定是否RELOAD
		if (getLastModify(fileName) > lastModify) {
			return true;
		}

		return false;
	}

	/**
	 * 根据文件名获取文件对象,在当前CLASSLOADER路径下寻找文件
	 * 
	 * @param fileName
	 *            文件名
	 * @return File 文件对象
	 * @throws Exception
	 *             获取文件过程中的任何异常
	 */
	public static File getFile(String fileName) throws Exception {
		return new File(getFileURL(fileName).getFile());
	}

	/**
	 * 获取文件最后修改时间
	 * 
	 * @param fileName
	 *            文件名
	 * @return long 文件最后修改时间
	 * @throws Exception
	 *             获取最后修改时间过程中的任何异常
	 */
	public static long getLastModify(String fileName) throws Exception {
		// 获取当前文件最新修改时间
		return getFile(fileName).lastModified();
	}

	/**
	 * 创建一个目录
	 * 
	 * @param dir
	 *            目录路径
	 * @param ignoreIfExitst
	 *            如果已经存在该目录是否忽略
	 * @return boolean 是否创建成功
	 * @throws Exception
	 *             创建目录过程中的任何异常
	 */
	public static boolean createDir(String dir, boolean ignoreIfExitst)
			throws Exception {
		File file = getFile(dir);

		if (ignoreIfExitst && file.exists()) {
			return false;
		}

		return file.mkdir();
	}

	/**
	 * 创建一个目录,如果它的父目录不存在,则自动创建
	 * 
	 * @param dir
	 *            目录路径
	 * @param ignoreIfExitst
	 *            如果已经存在该目录是否忽略
	 * @return boolean 是否创建成功
	 * @throws Exception
	 *             创建目录过程中的任何异常
	 */
	public static boolean createDirs(String dir, boolean ignoreIfExitst)
			throws Exception {
		File file = getFile(dir);

		if (ignoreIfExitst && file.exists()) {
			return false;
		}

		return file.mkdirs();
	}

	/**
	 * 删除文件
	 * 
	 * @param filename
	 *            被删除文件的文件名
	 * @return boolean 是否删除成功
	 * @throws Exception
	 *             删除文件过程中的任何异常
	 */
	public static boolean deleteFile(String filename) throws Exception {
		File file = getFile(filename);

		return deleteFile(file);
	}

	/**
	 * 删除文件
	 * 
	 * @param file
	 *            被删除文件
	 * @return boolean 是否删除成功
	 * @throws Exception
	 *             删除文件过程中的任何异常
	 */
	public static boolean deleteFile(File file) throws Exception {
		if (file.isDirectory()) {
			return deleteDir(file);
		}

		if (!file.exists()) {
			return false;
		}

		return file.delete();
	}

	/**
	 * 删除目录,包括其下的所有子目录和文件
	 * 
	 * @param dir
	 *            被删除的目录名
	 * @return boolean 是否删除成功
	 * @throws Exception
	 *             删除目录过程中的任何异常
	 */
	public static boolean deleteDir(File dir) throws Exception {
		if (dir.isFile()) {
			deleteFile(dir);
		}

		File[] files = dir.listFiles();

		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				File file = files[i];

				if (file.isFile()) {
					file.delete();
				} else {
					deleteDir(file);
				}
			}
		}

		return dir.delete();
	}

	/**
	 * 使用流里的内容创建一个新文件
	 * 
	 * @param stream
	 *            原文件流
	 * @param fileName
	 *            指定的文件路径及文件名
	 * @return File 生成的新文件
	 * @throws Exception
	 *             生成文件过程中的任何异常
	 */
	public static File createFile(InputStream stream, String fileName)
			throws Exception {
		File newFile = new File(fileName);
		OutputStream fileOut = new BufferedOutputStream(new FileOutputStream(
				newFile));
		byte[] buffer = new byte[8192];
		int bytesRead = 0;

		while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
			fileOut.write(buffer, 0, bytesRead);
		}

		fileOut.close();
		stream.close();

		return newFile;
	}

	public static void createFile(String output, String content)
			throws Exception {
		try {
			OutputStreamWriter fw = new OutputStreamWriter(
					new FileOutputStream(output));
			PrintWriter out = new PrintWriter(fw);
			out.print(content);
			out.close();
			fw.close();
		} catch (Exception ex) {
			throw new Exception(ex);
		}
	}

	// 获取可写流
	public static Writer openWithWrite(String file, boolean append)
			throws Exception {
		return new BufferedWriter(
				new FileWriter(FileUtil.getFile(file), append));
	}

	// 获取可读流
	public static Reader openWithRead(String file) throws Exception {
		return new BufferedReader(new FileReader(FileUtil.getFile(file)));
	}

	// 获得文件字节流
	public static byte[] getFileBytes(InputStream inputStream) throws Exception {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
				1024);
		byte[] block = new byte[512];

		while (true) {
			int readLength = inputStream.read(block);

			if (readLength == -1) {
				break; // end of file
			}

			byteArrayOutputStream.write(block, 0, readLength);
		}

		byte[] retValue = byteArrayOutputStream.toByteArray();

		byteArrayOutputStream.close();

		return retValue;
	}

	// 获得文件字节流
	public static byte[] getFileBytes(String file) throws Exception {
		return getFileBytes(getInputStream(file));
	}

	public static void move(String input, String output) throws Exception {
		File inputFile = new File(input);
		File outputFile = new File(output);
		try {
			inputFile.renameTo(outputFile);
		} catch (Exception ex) {
			throw new Exception("Can not mv" + input + " to " + output
					+ ex.getMessage());
		}
	}

	public static boolean copy(String input, String output) throws Exception {
		int BUFSIZE = 0x10000;
		FileInputStream fis = new FileInputStream(input);
		FileOutputStream fos = new FileOutputStream(output);
		try {
			byte buf[] = new byte[BUFSIZE];
			int i;
			while ((i = fis.read(buf)) > -1) {
				fos.write(buf, 0, i);
			}
		} catch (Exception ex) {
			throw new Exception("makeHome" + ex.getMessage());
		} finally {
			fis.close();
			fos.close();
		}
		return true;
	}

	public static void makeHome(String home) throws Exception {
		File homedir = new File(home);
		if (!homedir.exists()) {
			try {
				homedir.mkdirs();
			} catch (Exception ex) {
				throw new Exception("Can not mkdir :" + home
						+ " Maybe include special charactor!");
			}
		}
	}

	public static void copyDir(String sourcedir, String destdir)
			throws Exception {
		File dest = new File(destdir);
		File source = new File(sourcedir);
		String files[] = source.list();
		try {
			makeHome(destdir);
		} catch (Exception ex) {
			throw new Exception("CopyDir:" + ex.getMessage());
		}
		for (int i = 0; i < files.length; i++) {
			String sourcefile = source + File.separator + files[i];
			String destfile = dest + File.separator + files[i];
			File temp = new File(sourcefile);
			if (temp.isFile()) {
				try {
					copy(sourcefile, destfile);
				} catch (Exception ex) {
					throw new Exception("CopyDir:" + ex.getMessage());
				}
			}
		}

	}

	public static void recursiveRemoveDir(File directory) throws Exception {
		if (!directory.exists()) {
			throw new IOException(directory.toString() + " do not exist!");
		}
		String filelist[] = directory.list();
		File tmpFile = null;
		for (int i = 0; i < filelist.length; i++) {
			tmpFile = new File(directory.getAbsolutePath(), filelist[i]);
			if (tmpFile.isDirectory()) {
				recursiveRemoveDir(tmpFile);
			} else if (tmpFile.isFile()) {
				try {
					tmpFile.delete();
				} catch (Exception ex) {
					throw new Exception(tmpFile.toString()
							+ " can not be deleted " + ex.getMessage());
				}
			}
		}

		try {
			directory.delete();
		} catch (Exception ex) {
			throw new Exception(directory.toString() + " can not be deleted "
					+ ex.getMessage());
		} finally {
			filelist = null;
		}
	}

	// 从远程读文件,且保存在本地
	public static boolean remoteFileRead(String sUrl, String path) {
		try {
			URL url = new URL(sUrl);
			URLConnection conn = url.openConnection();
			conn.connect();
			HttpURLConnection httpConn = (HttpURLConnection) conn;
			if (httpConn.getResponseCode() == 200) {
				System.out.println("Connect to " + sUrl
						+ " failed,return code:" + httpConn.getResponseCode());
				return false;
			}
			File file = createFile(conn.getInputStream(), path);
			return true;
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}
	}

	public static String getFileString(String fileName) throws Exception {
		StringBuffer sb = new StringBuffer();
		BufferedReader br = null;
		String line = null;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					fileName)));
			while ((line = br.readLine()) != null) {
				sb.append(line + "\n");
			}
		} finally {
			// 关闭流
			IOUtils.closeQuietly(br);
		}
		return sb.toString();
	}

	public static String getFileString(String fileName, String charSet)
			throws Exception {
		StringBuffer sb = new StringBuffer();
		BufferedReader br = null;
		String line = null;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					fileName), charSet));
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
		} finally {
			// 关闭流
			IOUtils.closeQuietly(br);
		}
		return sb.toString();
	}

	// 将文本转成流
	public static InputStream stringToInputStream(String str)
			throws UnsupportedEncodingException {
		ByteArrayInputStream stream = new ByteArrayInputStream(str
				.getBytes("UTF-8"));
		return stream;
	}

	/**
	 * 搜索文件
	 * 
	 * @param dir
	 *            起始文件夹
	 * @param s
	 * @return
	 */
	public static File[] searchFiles(String dir, String s) {
		// 起始文件夹
		File file = new File(dir);
		s = s.replace('.', '#');
		s = s.replaceAll("#", "\\\\.");
		s = s.replace('*', '#');
		s = s.replaceAll("#", ".*");
		s = s.replace('?', '#');
		s = s.replaceAll("#", ".?");
		s = "^" + s + "$";
		Pattern p = Pattern.compile(s);
		List list = filePattern(file, p);
		if (list == null) {
			return null;
		}
		File[] rtn = new File[list.size()];
		list.toArray(rtn);
		return rtn;
	}

	/**
	 * @param file
	 *            File 起始文件夹
	 * @param p
	 *            Pattern 匹配类型
	 * @return ArrayList 其文件夹下的文件夹
	 */
	private static List filePattern(File file, Pattern p) {
		if (file == null) {
			return null;
		} else if (file.isFile()) {
			Matcher fMatcher = p.matcher(file.getName());
			if (fMatcher.matches()) {
				List list = new ArrayList();
				list.add(file);
				return list;
			}
		} else if (file.isDirectory()) {
			File[] files = file.listFiles();
			if (files != null && files.length > 0) {
				List list = new ArrayList();
				for (int i = 0; i < files.length; i++) {
					List rlist = filePattern(files[i], p);
					if (rlist != null) {
						list.addAll(rlist);
					}
				}
				return list;
			}
		}
		return null;
	}

	/**
	 * 打jar、war、zip包
	 * 
	 * @param jarFileName
	 * @param inputFilePath
	 * @param base
	 */
	public static void pack(String jarFileName, String inputFilePath,
			String base) {
		JarOutputStream jarOutputStream = null;
		try {
			File inputFile = new File(inputFilePath);
			jarOutputStream = new JarOutputStream(new FileOutputStream(
					jarFileName));
			pack(jarOutputStream, inputFile, base);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				jarOutputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private static void pack(JarOutputStream jarOutputStream, File inputFile,
			String base) throws IOException {
		if (inputFile.isDirectory()) {
			File[] files = inputFile.listFiles();
			jarOutputStream.putNextEntry(new JarEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < files.length; i++) {
				pack(jarOutputStream, files[i], base + files[i].getName());
			}
		} else {
			jarOutputStream.putNextEntry(new JarEntry(base));
			FileInputStream in = null;
			try {
				in = new FileInputStream(inputFile);
				int b;
				while ((b = in.read()) != -1) {
					jarOutputStream.write(b);
				}
			} finally {
				in.close();
			}
		}
	}
}

你可能感兴趣的:(java,ext,file)