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)); } }