zoukankan      html  css  js  c++  java
  • 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();
    
  • 相关阅读:
    数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)
    Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)
    Java实现第十一届蓝桥杯C/C++ 大学 B 组大赛软件类 省赛真题(希望能和各位大佬能一起讨论算法题:讨论群:99979568)
    Java实现第十一届蓝桥杯 省赛真题(希望能和各位大佬能一起讨论算法题:讨论群:99979568)
    Java引用类型之软引用(2)
    Java引用类型之软引用(1)
    Java引用类型
    对象的创建
    类的初始化
    初始化itable
  • 原文地址:https://www.cnblogs.com/zhiwenxi/p/11389334.html
Copyright © 2011-2022 走看看