Java中编码、解码的主要应用场景(二)

在java中主要有四个场景需要进行编码解码操作:

  1. I/O操作(磁盘I/O)
  2. 内存
  3. 数据库
  4. javaWeb(网络I/O)

下面分别介绍四种场景下的编、解码操作:


I/O操作(磁盘I/O):

四大基流:(字节输出流,字节输入流,字符输出流,字符输入流)

磁盘I/O中的读操作用到的类有两个:InputStream(读字节的父类)、Reader(读字符的父类);

磁盘I/O中的写操作用到的类有两个:OutputStream(写字节的父类)、Writer(写字符的父类);

Java中编码、解码的主要应用场景(二)_第1张图片

一般的,操作二进制文件(图片,音频,视频等)必须使用字节流.

一般的,操作文本文件建议使用字符流,也可使用字节流,一般指定解码字符集如

    @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"进行编码
同样的方法可以看到new String 的构造函数内部是调用StringCoding.decode()方法:
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场景下节介绍。




你可能感兴趣的:(Java中的编码,解码以及应用场景)