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