[进阶]Java:IO流分类、文件字节输入流、读取字节数据、避免乱码问题

IO流概述

  • I表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读。
  • O表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写。

IO流的分类

  • 按流的方向分
  •  
  •  按流中的数据最小单位分为

 

总结流的四大类:

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
  • 宇符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。

文件输入流:FileInputStream

作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。

每次读取一个字节

代码演示如下:

public class FileInputStreamDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream is = new FileInputStream("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data.txt");

        //2.读取一个字节返回(每次读取一滴水)
        int b1 = is.read();
        System.out.println((char) b1); // a

        int b2 = is.read();
        System.out.println((char) b2); // b

        int b3 = is.read();
        System.out.println((char) b3); // 1

        int b4 = is.read(); // 读取完毕返回-1
        System.out.println(b4);

        //3.使用循环改进
        int b;
        while ((b = is.read()) != -1){
            System.out.print((char) b);
        }
    }
}

每次读取一个字节数组存在什么问题?

  • 性能较慢
  • 读取中文字符输出无法避免乱码问题

每次读取一个字节数组

代码演示如下:

public class FileInputStreamDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream is = new FileInputStream("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data02.txt");
        //2.定义一个字节数组,用于读取字节数组
//        byte[] buffer = new byte[3]; //3B ----> 每次装三个字节
//        int len = is.read(buffer);
//        System.out.println("读取了几个字节:" + len);
//        String rs = new String(buffer);
//        System.out.println(rs);
//
//        int len1 = is.read(buffer);
//        System.out.println("读取了几个字节:" + len1);
//        String rs1 = new String(buffer);
//        System.out.println(rs1);
//
//        int len2 = is.read(buffer);
//        System.out.println("读取了几个字节" + len2);
//        // 读取多少倒出多少
//        String rs2 = new String(buffer,0,len2);
//        System.out.println(rs2);
//
//        int len3 = is.read(buffer);
//        System.out.println("读取了几个字节" + len3); // 读取完毕返回-1

        //3.改进使用循环,每次读取一个字节数组
        byte[] buffer = new byte[3];
        int len; // 记录每次读取的字节数
        while ((len = is.read(buffer)) != -1){
            //读取多少倒出多少
            System.out.print(new String(buffer,0,len));
        }
    }

每次读取一个字节数组存在什么问题?

  • 读写的性能得到了提升
  • 读取中文字符输出无法避免乱码问题

1、如何使用字节输入流读取中文内容输出不乱码呢?

  • 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

2、直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,字节数组可能引起内存溢出。

 代码演示如下:

public class FileInputStreamDemo03 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        File f = new File("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data02.txt");
        InputStream is = new FileInputStream(f);

        //2.定义一个字节数组与文件的大小刚刚好一样大
//        byte[] buffer = new byte[(int) f.length()];
//        int len = is.read(buffer);
//        System.out.println("读取了多少个字节:" + len);
//        System.out.println("文件大小:" + f.length());
//        System.out.println(new String(buffer));

        //读取全部字节数组
        byte[] buffer = is.readAllBytes();
        System.out.println(new String(buffer));
    }
}

1.如何使用字节输入流读取中文内容输出不乱码呢?

  • 一次性读取完全部字节。
  • 可以定义与文件一样大的字节数组读取,也可以使用官方APl•

2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,定义的字节数组可能引起内存溢出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值