java字符流的处理中文乱码,使用方法

字节流和字符流的区别?

1.字节流处理 换行 等字符不方便

2.字节流在 处理 文本文件的时候,如果做了人为的类型转换,很可能会出现乱码

3.字节流不能够处理编码问题

4.针对读取一行或者读取一部分的操作不方便

编码、解码

  • 编码: 将字符/字符数组/字符串 转换成 二进制
  • 解码: 将二进制 转换成 字符/字符数组/字符串
  • 编码表: 字符和十进制数值对应的一张表而已

为什么会产生乱码?

1.服务器,客户端,数据库,文件系统之间的编码和解码使用的编码表不一致 (沟通)

2.人为在使用字节流读取的过程中做了转换 (使用字符流解决)

编码解码的三种情况

1.处理字符情况

    // 1.处理字符情况
    char ch = 'a';
    // 编码
    System.out.println((int)ch);

    int i = 97;
    // 解码
    System.out.println((char)97);

2.处理字符串情况

		// 2.处理字符串情况
		String s = "中国Hello";
		// 编码
		byte[] bys = s.getBytes("UTF-8");
		System.out.println(Arrays.toString(bys)); // [-42, -48, -71, -6, 72, 101, 108, 108, 111]
		
		// 解码
		String ss = new String(bys, "UTF-8");
		System.out.println(ss);

3.处理文本文件情况

OutputStreamWriter(转换流,是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认字符集编码。)

OutputStreamWriter(OutputStream out)  创建使用默认字符编码的字符输出转换流

OutputStreamWriter(OutputStream out, Charset cs)  创建使用cs字符集的字符输出转换流

OutputStreamWriter(OutputStream out, CharsetEncoder enc)  创建使用enc字符集编码器的

OutputStreamWriter(OutputStream out, String charsetName)  创建使用指定字符集的

Writer append(char c) 
		将指定字符添加到此 writer。 
Writer append(CharSequence csq) 
		将指定字符序列添加到此 writer。 
Writer append(CharSequence csq, int start, int end) 
		将指定字符序列的子序列添加到此 writer.Appendable。 
abstract  void close() 
		关闭此流,但要先刷新它。 
abstract  void flush() 
		刷新该流的缓冲。 
void write(char[] cbuf) 
		写入字符数组。 
abstract  void write(char[] cbuf, int off, int len) 
		写入字符数组的某一部分。 
void write(int c) 
    	写入单个字符。 
void write(String str) 
    	写入字符串。 
void write(String str, int off, int len) 
    	写入字符串的某一部分。 
    String s = "HelloWorld";
    Writer w = new OutputStreamWriter(new FileOutputStream("out.txt"),"utf-8");
    w.write(s);
    w.append("good");
    w.append("morning");
    w.append('a');
    w.write(new char[] {'a','b','c'});
    w.write("中国你好");
    w.flush();
    w.close();

转换字符输入流

int read()
读取单个字符。

int read(char[] cbuf)
将字符读入数组。

abstract int read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。

    Reader r = new InputStreamReader(new FileInputStream("out.txt"), "UTF-8");		
    char[] chs = new char[5];
    int len = 0;
    while ((len = r.read(chs)) != -1) {
        System.out.println(new String(chs, 0, len));
    }
字符流拷贝一个文件
    InputStreamReader isr = new InputStreamReader(new FileInputStream("test.java"));
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"));

    int len = 0;
    char[] chs = new char[1024];

    while ((len = isr.read(chs)) != -1) {
        osw.write(chs, 0, len);
        osw.flush();
    }

    isr.close();
    osw.close();
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值