Java 编码 :字符串变成字节数组 ,String --> byte[] ,str.getBytes(charsetName);
Java 解码 :字节数组变成字符串 , byte[]--> String ,new String(byte[],charsetName);
我们知道涉及到编码的地方一般都在字符到字节或者字节到字符的转换上,而需要这种转换的场景主要是在 I/O 的时候,这个 I/O 包括磁盘 I/O 和网络 I/O。下图是 Java 中处理 I/O 问题的接口:

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

同样 StreamEncoder 类负责将字符编码成字节,编码格式和默认编码规则与解码是一致的。
但如果编码时有指定特定的编码格式,那解码格式也应要相同。
package javase.day18;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class EncodeStream {
public static void main(String[] args) {
writeText();
readText();
}
//编码
public static void writeText(){
try {
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("C:\\java_test\\GBK.txt"),"GBK");
osw.write("你好啊");//文件大小为6字节
osw.close();
OutputStreamWriter osw2=new OutputStreamWriter(new FileOutputStream("C:\\java_test\\UTF8.txt"),"UTF-8");
osw2.write("你好啊");//文件大小为9字节
osw2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//解码
public static void readText(){
try {
InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\java_test\\GBK.txt"),"GBK");//如果charset为UTF-8则会输出乱码
char[] buf = new char[10];
int len = isr.read(buf);
String str= new String(buf,0,len);
System.out.println(str);//控制台输出“你好啊”
} catch (IOException e) {
e.printStackTrace();
}
}
}
参考文章:
http://www.enet.com.cn/article/2007/1030/A20071030887842.shtml
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/