Java字符串中的编码解码问题

编码:

  • byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
  • byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果到新的字节数组中。

解码:

  • String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
  • String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

关于字符集

例:(用的是idea编译器)

		String s = "中国";

		//byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
        byte[] bys1 = s.getBytes();
        System.out.println(Arrays.toString(bys1));
        //输出:[-28, -72, -83, -27, -101, -67]
        //说明用3个字节表示一个汉字

		//byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果到新的字节数组中。
        byte[] bys2 = s.getBytes("UTF-8");//采用UTF-8字符集
        System.out.println(Arrays.toString(bys2));
        //输出:[-28, -72, -83, -27, -101, -67]
        //和上面一样,说明idea是默认UTF-8的
		byte[] bys3 = s.getBytes("GBK");//手动修改为GBK
        System.out.println(Arrays.toString(bys3));
        //[-42, -48, -71, -6]变为两个字节表示一个汉字了

		//String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
        String ss = new String(bys1);//这里用的是上面用过的bys1
        System.out.println(ss);
        //输出:中国
		String ss = new String(bys1,"GBK");
        System.out.println(ss);
        //输出:涓浗
        //因为编译器默认是UTF-8,但我们强行用GBK的编制来解码,所以出错
        byte[] bys4 = s.getBytes("GBK");
        ss = new String(bys4,"GBK");
        System.out.println(ss);
        //输出:中国

字符流抽象基类

  • Reader:字符输入流的抽象类‘
  • Writer:字符输出流的抽象类

字符流中和编码解码问题相关的两个类:

  • InputStreamReader
  • OutputStreamWriter
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Software\\File\\test1.txt"));
        osw.write("中国");
        osw.close();

执行后:
在这里插入图片描述

		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Software\\File\\test1.txt"),"GBK");
        osw.write("中国");
        osw.close();

执行后:
在这里插入图片描述
因为idea是按照UTF-8来读的。
保留上面的结果,再补一段代码。

InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Software\\File\\test1.txt"),"GBK");
        int ch;
        while((ch = isr.read()) != -1){
            System.out.print((char)ch);
        }
        //输出:中国
        isr.close();

字符流写数据的5种方式

方法名说明
void write(int c)写一个字符
void write(char[] cbuf)写入一个字符数组
void write(char[] cbuf,int off,int len)写入字符数组的一部分
void write(String str)写一个字符串
void write(String str,int off,int len)写一个字符串的一部分
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Software\\File\\test1.txt"));

        //void writer(int c)写一个字符
        osw.write(97);
        //void flush()刷新流,也可以不写,只要后面close()也会刷新
        osw.flush();

        //void write(char[] cbuf)写入一个字符数组
        char[] c1 = {'b', 'c'};
        osw.write(c1);

        //void write(char[] cbuf,int off,int len)写入字符数组的一部分
        char[] c2 = {'d','e'};
        osw.write(c2,1,1);这里下标是1,选择长度为1,即写入字符e

        //void write(String str)写一个字符串
        String s1 = "fg";
        osw.write(s1);

        //void write(String str,int off,int len)写一个字符串的一部分
        String s2 = "hi";
        osw.write(s2,1,1);//这里下标是1,选择长度为1,即写入字符i

        osw.close();
方法名说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会刷新流。一旦关闭,就不能再写数据

字符流读数据的2种方式

方法名说明
int read()一次读一个字符数据
int read(char[] cbuf)一次读一个字符数组数据

例:继续使用上面代码的结果来测试

//InputStreamReader (InputStream in)
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Software\\File\\test1.txt"));

        int ch;
        while ((ch = isr.read()) != -1){
            System.out.print((char)ch);
        }//打印:abcefgi
        ----------------------------------------------
        char[] c = new char[1024];
        int len;
        while((len = isr.read(c)) != -1){
            System.out.println(new String(c,0,len));
        }//打印:abcefgi

        isr.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值