JAVA基础14:字节缓冲区,编码解码问题,字符流,字符流缓冲区

2232-任同学

发表文章数:19

热门标签

首页 » Java » 正文
package com.i;

import java.io.*;

public class Test_buffer {
    /**
     * 字节缓冲区流:缓冲区的构造方法只是为字节流提供了一个缓冲区,底层还是由字节流来完成读写
     *      BufferedOutputStream:
     *      BufferedInputStream:
     *
     *      构造方法:
     *      public BufferedOutputStream(OutputStream out,
     *                             int size)
     *      创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。
     *
     *      底层代码如下:
     *      public BufferedOutputStream(OutputStream out) {
     *         this(out, 8192);
     *     }
     *
     *
     */
    public static void main(String[] args) throws FileNotFoundException {

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bb.txt"));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bb.txt"));

    }
}

编码解码概述图:

JAVA基础14:字节缓冲区,编码解码问题,字符流,字符流缓冲区

 

package com.i;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Test_liu {
    /**
     * 字节流读取数据可能出现的问题:
     *          汉字占两个字节。一个字节一个字节读取在控制台输出会无法识别出这是个汉字。
     *
     *          文件的复制一个一个字节复制却可以得到汉字的原因:计算机底层会根据字节进行拼接,得到汉字。
     *
     *          汉字的存储规则:第一个字节一定是负数,第二个可能是负数也可能是正数,大部分情况下是负数。
     *
     *  编码表:看图
     *
     *  String的编码和解码:
     *          不加参数使用的是平台自己的编码格式
     *          编码:byte[] bys = str.getBytes(StandardCharsets.ISO_8859_1);
     *          解码:new String(bys,StandardCharsets.UTF_8)
     *
     *  转换流中的解码和编码问题:
     *          转换流其实就是一个字符流。
     *          转换流=字节流+编码表
     *
     *          输入输出流使用方法:
     *          OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("aa.txt"),“US_ASCII”);
     *          InputStreamReader isr = new InputStreamReader(new FileInputStream("aa.txt"),"UTF-8");
     *
     */

    public static void main(String[] args) throws IOException {
//        String str = "你好啊";
//        byte[] bys = str.getBytes(StandardCharsets.UTF_8);
//
//        System.out.println(Arrays.toString(bys));

        String str = "你好";

        //[-28, -67, -96, -27, -91, -67]   说明平台默认的编码格式是UTF-8
//        byte[] bys = str.getBytes();
        //[63, 63]
//        byte[] bys = str.getBytes(StandardCharsets.ISO_8859_1);
//        System.out.println(Arrays.toString(bys));
//        System.out.println(new String(bys,StandardCharsets.UTF_8));

        //不使用默认UTF-8写入为乱码
//        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("aa.txt"),StandardCharsets.US_ASCII);
//        osw.write("你好2");

        //使用对应编码读数据
        InputStreamReader isr = new InputStreamReader(new FileInputStream("aa.txt"),"UTF-8");
//
        int in;
        while(-1 != (in = isr.read()) ){
            System.out.println("----------------------------");
            System.out.println((char)in);
        }
//        osw.close();
        isr.close();

    }
}

———–字符流

package com.i;

import java.io.*;

public class Test_writer {
    /**
     *字符流写入的方法:
     *          osw.write(97);
     *         osw.write('b');
     *         osw.write(new char[]{'a', 'b', 'c', 'd', 'e'});
     *         osw.write(new char[]{'a','b','c','d','e'},1,3);
     *         osw.write("abcde");
     *         osw.write("abcde",0,3);
     *
     *         字符流需要刷新的大概原因:一般字符占两个字节,无法判断最后一个字符是否只写了一半,系统不会对文件进行刷新,需要手动刷新。
     *         osw.flush();
     *
     *         osw.close();关闭字符流里默认调用了flush();
     *
     * 字符流读数据的两种方法(主要目的复习):
     *          int i;
     * //        while(-1!=(i=isr.read())){
     * //            System.out.print((char)i);
     * //        }
     *             char[] cs = new char[1024];
     *             int len;
     *             while(-1 != (len = isr.read(cs))){
     *                 System.out.print(new String(cs,0,len));
     *             }
     */
    public static void main(String[] args) throws IOException {
//        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("abb.txt"));
//        osw.write(97);
//        osw.write('b');
//        osw.write(new char[]{'a', 'b', 'c', 'd', 'e'});
//        osw.write(new char[]{'a','b','c','d','e'},1,3);
//        osw.write("abcde");
//        osw.write("abcde",0,3);
//        osw.flush();
//        osw.close();

        InputStreamReader isr = new InputStreamReader(new FileInputStream("src/Test/Test_Students_Test.java"));
//        int i;
//        while(-1!=(i=isr.read())){
//            System.out.print((char)i);
//        }
            char[] cs = new char[1024];
            int len;
            while(-1 != (len = isr.read(cs))){
                System.out.print(new String(cs,0,len));
            }
        isr.close();

    }
}

—-字符流缓冲区

package com.i;

import java.io.*;

public class Test_zfbuffer {
    /**
     * 字符缓冲区流:
     *           BufferedReader br = new BufferedReader(new FileReader(""));
     *         BufferedWriter bw = new BufferedWriter(new FileWriter(""));
     *
     * 字符流缓冲区的特殊功能:
     *          BufferedWriter:new Line();//根据操作系统自动加上换行
     *                  for (int i=0;i<3;i++){
     * //            bw.write("Hello"+i);
     * //            bw.newLine();//根据操作系统自动加上换行
     * //            bw.flush();//一般写一行刷新一下,方便确认数据
     * //               }
     *
     *          public String readLine()
     *                 throws IOException
     * 读一行文字。 一行被视为由换行符('/ n'),回车符('/ r')中的任何一个或随后的换行符终止。
     * 结果
     * 包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null
     */
    public static void main(String[] args) throws IOException {

//        BufferedWriter bw = new BufferedWriter(new FileWriter("aa.txt"));
//
//        for (int i=0;i<3;i++){
//            bw.write("Hello"+i);
//            bw.newLine();//根据操作系统自动加上换行
//            bw.flush();//一般写一行刷新一下,方便确认数据
//        }
//
//        bw.close();

        BufferedReader br = new BufferedReader(new FileReader("aa.txt"));

        String str;
        while((str = br.readLine()) != null){
            System.out.println(str);//
        }
        br.close();


    }
}
标签:

未经允许不得转载:作者:2232-任同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《JAVA基础14:字节缓冲区,编码解码问题,字符流,字符流缓冲区》 发布于2021-10-11

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录