现在的位置: 首页 > 综合 > 正文

IO操作的工具类总结

2013年01月10日 ⁄ 综合 ⁄ 共 5589字 ⁄ 字号 评论关闭
/**
 *  ClassName: IOHelper.java
 *  Created on 2013
 *  Copyrights 2013 hi.csdn.net/tjcyjd All rights reserved.
 *  site: http://hi.csdn.net/tjcyjd
 *  email: 908599713@qq.com
 */
package com.kinder.common;

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * IO操作的工具类
 * 
 * @author yjd
 */
public class IOHelper {
	private static Logger logger = LoggerFactory.getLogger(IOHelper.class);

	private IOHelper() {
	}

	/**
	 * 根据指定的文件名从classpath下把该文件加载成InputStream实例
	 * 
	 * @param path
	 * @return
	 */
	public static InputStream getInputStreamFromClassPath(String path) {
		return Thread.currentThread().getContextClassLoader()
				.getResourceAsStream(path);
	}

	/**
	 * 创建目录
	 * 
	 * @param dirFile
	 * @return
	 * @throws RuntimeException
	 */
	public static boolean createDir(File dirFile) throws RuntimeException {
		boolean flag = false;
		if (dirFile.exists()) {
			flag = true;
		} else {
			flag = dirFile.mkdirs();
		}
		return flag;
	}

	/**
	 * 删除目录
	 * 
	 * @param dirFile
	 * @return
	 * @throws RuntimeException
	 */
	public static boolean deleteDir(File dirFile) throws RuntimeException {
		boolean flag = false;
		if (!dirFile.exists()) {
			flag = true;
		} else {
			if (deleteSubFiles(dirFile)) {
				flag = dirFile.delete();
			}
		}
		return flag;
	}

	/**
	 * 清空指定目录下的所有文件
	 * 
	 * @param dir
	 */
	public static boolean deleteSubFiles(File dir) {
		logger.debug("开始清除{}下的所有文件", dir.getAbsolutePath());
		boolean flag = false;
		if (dir.exists() && dir.isDirectory()) {
			File[] subs = dir.listFiles();
			int succ = 0;
			int fail = 0;
			int length = subs == null ? 0 : subs.length;
			File sub = null;
			try {
				for (int i = 0; i < length; i++) {
					sub = subs[i];
					if (sub.delete()) {
						succ++;
					} else {
						fail++;
					}
				}
				flag = true;
			} catch (Exception e) {
				logger.error("清除{}下的" + sub.getAbsolutePath() + "文件失败,原因是:{}",
						dir.getAbsolutePath(), e);
			}
			logger.debug("清除{}下的所有文件, 成功{}个", dir.getAbsolutePath(), succ);
			logger.debug("清除{}下的所有文件, 失败{}个", dir.getAbsolutePath(), fail);
		}
		return flag;
	}

	/**
	 * 获取指定文件的扩展名
	 * 
	 * @param fileName
	 * @return
	 */
	public static String getExtend(String fileName) {
		return fileName.substring(fileName.lastIndexOf('.'));
	}

	/**
	 * 使用当前日期时间来产生"yyyyMMddHHmmssSSS"的字符串,主要用来做文件名
	 * 
	 * @return
	 */
	public static String generateFileNameByDateTime() {
		return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
	}

	/**
	 * 把源文件的内容复制到目标文件
	 * 
	 * @param src
	 *            源文件
	 * @param dest
	 *            目标文件
	 */
	public static void copy(File src, File dest) throws IOException {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		byte[] b = new byte[8192];
		try {
			bis = new BufferedInputStream(new FileInputStream(src));
			bos = new BufferedOutputStream(new FileOutputStream(dest));

			for (int count = -1; (count = bis.read(b)) != -1;) {
				bos.write(b, 0, count);
			}
			bos.flush();
		} catch (IOException e) {
			throw e;
		} finally {
			close(bis);
			close(bos);
		}
	}

	/**
	 * 把源图片srcImg缩小至指定的宽度和高度并存放至dest目标文件
	 * 
	 * @param srcImg
	 * @param dest
	 * @param outWidth
	 * @param outHeight
	 */
	public static void resizeToFile(BufferedImage srcImg, File dest,
			int outWidth, int outHeight) throws RuntimeException {
		BufferedImage pbFinalOut = null;
		if (srcImg.getWidth() == outWidth && srcImg.getHeight() == outHeight) {
			pbFinalOut = srcImg;
		} else {
			pbFinalOut = IOHelper.scaleImage(srcImg, outWidth, outHeight);
		}
		FileOutputStream out = null;
		try {
			out = new FileOutputStream(dest);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(pbFinalOut);
		} catch (ImageFormatException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			close(out);
		}
	}

	/**
	 * 把源图像缩小成指定宽高
	 * 
	 * @param srcImg
	 *            源图片
	 * @param outWidth
	 *            宽
	 * @param outHeight
	 *            高
	 * @return 压缩后的图像对象
	 */
	public static BufferedImage scaleImage(BufferedImage srcImg, int outWidth,
			int outHeight) {
		int width = srcImg.getWidth();
		int height = srcImg.getHeight();
		int[] rgbArray = srcImg.getRGB(0, 0, width, height, null, 0, width);
		BufferedImage pbFinalOut = new BufferedImage(outWidth, outHeight,
				BufferedImage.TYPE_INT_RGB);
		double hScale = ((double) width) / ((double) outWidth);// 宽缩小的倍数
		double vScale = ((double) height) / ((double) outHeight);// 高缩小的倍数

		int winX0, winY0, winX1, winY1;
		int valueRGB = 0;
		long R, G, B;
		int x, y, i, j;
		int n;
		for (y = 0; y < outHeight; y++) {
			winY0 = (int) (y * vScale + 0.5);// 得到原图高的Y坐标
			if (winY0 < 0) {
				winY0 = 0;
			}
			winY1 = (int) (winY0 + vScale + 0.5);
			if (winY1 > height) {
				winY1 = height;
			}
			for (x = 0; x < outWidth; x++) {
				winX0 = (int) (x * hScale + 0.5);
				if (winX0 < 0) {
					winX0 = 0;
				}
				winX1 = (int) (winX0 + hScale + 0.5);
				if (winX1 > width) {
					winX1 = width;
				}
				R = 0;
				G = 0;
				B = 0;
				for (i = winX0; i < winX1; i++) {
					for (j = winY0; j < winY1; j++) {
						valueRGB = rgbArray[width * j + i];
						R += getRedValue(valueRGB);
						G += getGreenValue(valueRGB);
						B += getBlueValue(valueRGB);
					}
				}
				n = (winX1 - winX0) * (winY1 - winY0);
				R = (int) (((double) R) / n + 0.5);
				G = (int) (((double) G) / n + 0.5);
				B = (int) (((double) B) / n + 0.5);
				valueRGB = comRGB(clip((int) R), clip((int) G), clip((int) B));
				pbFinalOut.setRGB(x, y, valueRGB);
			}
		}
		return pbFinalOut;
	}

	private static int clip(int x) {
		if (x < 0)
			return 0;
		if (x > 255)
			return 255;
		return x;
	}

	private static int getRedValue(int rgbValue) {
		int temp = rgbValue & 0x00ff0000;
		return temp >> 16;
	}

	private static int getGreenValue(int rgbValue) {
		int temp = rgbValue & 0x0000ff00;
		return temp >> 8;
	}

	private static int getBlueValue(int rgbValue) {
		return rgbValue & 0x000000ff;
	}

	private static int comRGB(int redValue, int greenValue, int blueValue) {
		return (redValue << 16) + (greenValue << 8) + blueValue;
	}

	/**
	 * 同时关闭输入流和输出流,并把可能抛出的异常转换成RuntimeException
	 * 
	 * @param is
	 * @param os
	 */
	public static void close(InputStream is, OutputStream os) {
		close(is);
		close(os);
	}

	/**
	 * 关闭输入流的工具方法,并把可能抛出的异常转换成RuntimeException
	 * 
	 * @param is
	 */
	public static void close(InputStream is) {
		if (is != null) {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 关闭输出流的工具方法,并把可能抛出的异常转换成RuntimeException
	 * 
	 * @param os
	 */
	public static void close(OutputStream os) {
		if (os != null) {
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

欢迎加入java讨论群:130188005

抱歉!评论已关闭.