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

本文探讨JAVA中的字节缓冲区及其在编码解码问题中的应用,同时深入解析字符流和字符流缓冲区的概念,帮助理解JAVA输入输出处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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"));

    }
}

编码解码概述图:

 

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();


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值