JAVA读写文件的基本方法,Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码。

写的情况也是类似,字符的父类是 Writer,字节的父类是 OutputStream,通过 OutputStreamWriter 转换字符到字节。

下面是我的具体实现对一个文件的读写操作:

package j2se.common;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

/**
 * 
 * 功能描述:读取文件与输入文件工具类
 *
 * @author  lizhenbin
 *
 * <p>修改历史:(修改人,修改时间,修改原因/内容)</p>
 */
public class IOUtil {
	
	/**
	 * ISO编码
	 */
	private static final String ISO_ENCODE = "ISO-8859-1";
	/**
	 * GBK编码
	 */
	private static final String GBK_ENCODE = "GBK";
	/**
	 * UTF-8编码
	 */
	private static final String UTF_ENCODE = "UTF-8";
	/**
	 * 缓冲区大小
	 */
	private static final int BUF_SIZE = 64;
	
	/**
	 * 构建单例模式
	 */
	private static final IOUtil instance = new IOUtil();
	private IOUtil() {}
	public static IOUtil getInstance() {
		return instance;
	}
	
	/**
	 * 
	 * 功能描述:通过OutputStreamWriter写入文件
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Aug 19, 2012 11:35:23 AM</p>
	 *
	 * @param filePath
	 * 			文件路径
	 * @param charset
	 * 			字符集
	 * @param message
	 * 			写入文件内容
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public static boolean writeByOutputStreamWriter(String filePath, String charset, Object message) {
		if(!paramCheck(filePath) || !paramCheck(charset))
			return false;
		if(message == null)
			message = "";
		OutputStream outs = null;
		OutputStreamWriter writer = null;
		try {
			outs = new FileOutputStream(filePath);
			writer = new OutputStreamWriter(outs, charset);
			writer.write(message.toString());
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(writer != null)
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if(outs != null)
				try {
					outs.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		return false;
	}
	
	/**
	 * 
	 * 功能描述:通过InputStreamReader读取文件
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Aug 19, 2012 11:28:33 AM</p>
	 *
	 * @param filePath
	 * 			文件URL
	 * @param charset
	 * 			字符集
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public static String readByInputStreamReader(String filePath, String charset) {
		if(!paramCheck(filePath) || !paramCheck(charset))
			return null;
		InputStream ins = null;
		InputStreamReader reader = null;
		try {
			ins = new FileInputStream(filePath);
			reader = new InputStreamReader(ins, charset);
			StringBuffer sb = new StringBuffer();
			char[] buf = new char[BUF_SIZE];
			int count = 0;
			while((count = reader.read(buf)) != -1) {
				sb.append(buf, 0, count);
			}
			return sb.toString();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(reader != null)
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if(ins != null)
				try {
					ins.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		return null;
	}
	
	/**
	 * 
	 * 功能描述:ISO-8859-1编码的字符串转换成GBK
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Aug 19, 2012 11:42:19 AM</p>
	 *
	 * @param isoStr
	 * 			ISO编码字符串
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public static String isoToGBK(String isoStr) {
		try {
			return new String(isoStr.getBytes(ISO_ENCODE), GBK_ENCODE);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 
	 * 功能描述:ISO-8859-1编码的字符串转换成UTF-8
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Aug 19, 2012 11:42:19 AM</p>
	 *
	 * @param isoStr
	 * 			ISO编码字符串
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public static String isoToUtf8(String isoStr) {
		try {
			return new String(isoStr.getBytes(ISO_ENCODE), UTF_ENCODE);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 
	 * 功能描述:空值验证
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Aug 19, 2012 11:22:34 AM</p>
	 *
	 * @param filePath
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	private static boolean paramCheck(String param) {
		if(param != null && !param.equals(""))
			return true;
		return false;
	}
	
	public static void main(String[] args) {
		IOUtil io = IOUtil.getInstance();
		System.out.println(io.readByInputStreamReader("d:\\test.txt", IOUtil.GBK_ENCODE));
	}
	
}