代码改变世界

Day36IO流

2022-09-04 14:00  rebirthhhh  阅读(18)  评论(0编辑  收藏  举报

字符集

计算机底层不可以直接存储字符,计算机中底层只能存储二进制(0、1)

二进制是可以转换为十进制的

据算计可以给人类字符进行编号存储,这套编号规则就是字符集。

ASCII字符集

IO流

IO流也称为输入、输出流,就是用来读写数据的。

I表示input,是数据从硬盘文件读入到内存的过程,成为输入。负责读。

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

按流的数据最小单位分可分为:字节流 (任何)、字符流(文本)

流的四大类:

1.字节输入流(InputStream):以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流。

2.字节输出流(OutputStream):以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流成为字节输出流。

3.字符输入流(Reader):以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。

4.字符输出流(Writer):以内存为基准,把内存中的数据写到次怕文件或者网络介质中去的流称为字符输出流。

它们是四大抽象类,不能直接用,要用它们的子类:

FileInputStream

FileOutputStream

FileReader

FileWriter

IO流的作用?

读写文件数据的。

package File;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class Demo02 {
    public static void main(String[] args) throws Exception {

        //1.创建一个文件字节输入流管道与源文件接通。
        //InputStream is = new FileInputStream(new File("E:\\JavaSE\\基础语法\\src\\data"));
        InputStream is = new FileInputStream(("E:\\JavaSE\\基础语法\\src\\data"));
        //简化写法

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

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

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

        //int b4 = is.read();
        //System.out.println((char) b4);//空

        //3.使用循环改造
        //定义一个变量记录每次读取的字节
        int b;
        while ((b = is.read()) != -1){
            System.out.print((char)b);
        }
    }
}

1.文件字节输入流,每次读取一个字节的api是哪个?

public int read():每次读取一个字节返回,如果字节已经没有可读返回-1

2.每次读取一个字节存在什么问题?

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

public int read(byte[] bufer):每次读取一个字节数组返回,如果字节已经没有可读的返回-1

package File;

//使用文件字节输入流每次读取一个字节数组的数据

import java.io.FileInputStream;
import java.io.InputStream;

public class Demo03 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream is = new FileInputStream("E:\\JavaSE\\基础语法\\src\\data02");


        //定义一个字节数组,用于读取字节数组
        //byte[] buffer = new byte[3];//1KB
        //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);
        //System.out.println(rs2);

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





    }
}

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

读取的性能得到了提升

读取中文字符输出无法避免乱码问题