在java中主要有四个场景需要进行编码解码操作:
下面分别介绍四种场景下的编、解码操作:
I/O操作(磁盘I/O):
四大基流:(字节输出流,字节输入流,字符输出流,字符输入流)
磁盘I/O中的读操作用到的类有两个:InputStream(读字节的父类)、Reader(读字符的父类);
磁盘I/O中的写操作用到的类有两个:OutputStream(写字节的父类)、Writer(写字符的父类);
一般的,操作二进制文件(图片,音频,视频等)必须使用字节流.
一般的,操作文本文件建议使用字符流,也可使用字节流,一般指定解码字符集如:
@Test
public void test2() throws IOException {
File file = new File("file/stream.text");
InputStream in = new FileInputStream(file);
byte[] bytes = new byte[1024];//缓存数组
int len=-1;
while((len=in.read(bytes))!=-1){
System.out.println(new String(bytes,0,len,"UTF-8"));//指定解码字符集
}
in.close();
}
输出结果:ABCD我
stream.text文件编码格式为UTF-8,内容为:ABCD我
如果使用GBK解码则出现乱码:
System.out.println(new String(bytes,0,len,"GBK"));
输出结果:ABCD鎴�
如果不指定字符集则使用系统默认编码进行解码。
内存:
@Test
public void test3() throws IOException {
String str = "我喜欢Java";
byte[] bytes = str.getBytes();//编码
System.out.println("系统默认编码编码为:"+Arrays.toString(bytes));
str= new String(bytes);//解码
System.out.println("使用系统默认编码解码为:"+str);
str = new String(bytes, "UTF-8");//解码
System.out.println("使用UTF-8解码为:"+str);
str = new String(bytes, "GBK");//解码
System.out.println("使用GBK解码为:"+str);
}
输出结果为:
系统默认编码编码为:[-26, -120, -111, -27, -106, -100, -26, -84, -94, 74, 97, 118, 97]
使用系统默认编码解码为:我喜欢Java
使用UTF-8解码为:我喜欢Java
使用GBK解码为:鎴戝枩娆ava
在这段代码中使用一次编码,三次解码。
先看编码:
byte[] bytes = str.getBytes();//编码
内部调用StringCoding.encode()方法操作:
public byte[] getBytes() {
return StringCoding.encode(value, 0, value.length);
}
static byte[] encode(char[] ca, int off, int len) {
String csn = Charset.defaultCharset().name();
try {
// use charset name encode() variant which provides caching.
return encode(csn, ca, off, len);
} catch (UnsupportedEncodingException x) {
warnUnsupportedCharset(csn);
}
try {
return encode("ISO-8859-1", ca, off, len);
} catch (UnsupportedEncodingException x) {
// If this code is hit during VM initialization, MessageUtils is
// the only way we will be able to get any kind of error message.
MessageUtils.err("ISO-8859-1 charset not available: "
+ x.toString());
// If we can not find ISO-8859-1 (a required encoding) then things
// are seriously wrong with the installation.
System.exit(1);
return null;
}
}
encode(
char
[] ca,
int
off,
int
len
)方法首先调用系统的默认编码格式,进一步深入:
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
如果默认编码格式==null,则使用"ISO-8859-1"进行编码
public String(byte bytes[]) {
this(bytes, 0, bytes.length);
}
public String(byte bytes[], int offset, int length) {
checkBounds(bytes, offset, length);
this.value = StringCoding.decode(bytes, offset, length);
}
decode解码操作和encode相反。
db.url=jdbc:mysql://127.0.0.1:3306/数据库名称?useUnicode=true&characterEncoding=UTF8
javaWeb(网络I/O):
javaWeb场景需要了解URL、get、POST的编码,servlet的解码,所以javaWeb场景下节介绍。