IO流

一、缓冲的概念

例:
看视频的时候觉得卡,等他一会,让他缓冲一下。
快递不是一件商品发过来,攒够一车发过来。

计算机的cpu通过内存从磁盘上面获取数据的,不是一个字节一个字节读的。每次从磁盘上面读4kb的数据。

这是为了减少cpu通过内存访问磁盘的次数。
1.为了提高读取和存储的效率
2.保护咱们的磁盘(硬盘)

操作文件:

读取和写入数据,如果你按照一个字节或者一个字符进行处理的时候,效率是非常低的。采用缓冲的概念来进行

读取和写入:

1.读取数据,通过内存访问此磁盘的习惯,读取的是4kb整数倍,再缓冲到内存中
2.写入数据,首先把数据缓冲到内存中,攒够4kb以后。再写入磁盘中

二、IO流的分类

输入输出流

参照物是内存
I
Input 输入 从硬盘读取数据到内存里面。这是输入
O
Output 输出 从内存写入到硬盘。这是输出

处理方式:

字节 :是按照字节为单位处理当前文件
输入字节流: InputStream
输出字节流: OutputStream

字符 :首先是按照字节为单位进行处理文件,但是操作过程中会有解码的过程。
输入字符流:Reader
输出字符流:Writer

核心方法 :

read(); write();

缓冲流

所有的缓冲流都是没有读写能力,起到一个缓冲的作用。读写能力只能是字符流或者字节流字节输入缓冲
字节输入缓冲----对应字节输入流:BufferedInputStream
字节输出缓冲----对应字节输出流:BufferedOutputStream
字符流输入缓冲:BufferedReader
字符流输出缓冲:BufferedWriter

三、输入输出过程

字节输入流缓冲读取文件:

1、找到对应的文件,创建对应文件File类对象。
2、创建对应的File类对象的FileInputStream 文件输入字节流对象
3、使用FileInputStream这个对象创建对用的BufferedInputStream对象
4、使用read方法将磁盘上面的数据写入到内存(byte数组中)
5、关闭流 close()

示例:

import java.io.*;

/**
 * @author wangbo
 * @version 1.0
 * @date 2021/3/18 10:03
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {
        //1.创建对应的文件的File类的对象
        File file = new File("c:/aaa/2.txt");
        //2.创建对应的File类对象的FileInputStream  文件输入字节流对象
        FileInputStream fis = new FileInputStream(file);
        //3.使用FileInputStream这个对象创建对用的BufferedInputStream对象
        BufferedInputStream bis = new BufferedInputStream(fis);
        //4.读取数据(从磁盘读到内存中)
        byte[] buf = new byte[1024* 4];
        /**
         * int read(byte[] buf); 最常用的
         * buf:  是一个字节数组。该数组是1024的整数倍。缓冲数组。用来保存读取的数据的
         * int:在读取的过程中,或者的字节个数。如果读取到文件的末尾,就会EOF   -1
         *
         */
        int length = -1;
        while((length = bis.read(buf)) != -1) {
            System.out.println(length);
            System.out.println(new String(buf, 0, length));
        }
        //5.g关闭
        bis.close();
    }
}

运行结果:

51
二二二二二
三三三三三
四四四四四

字节输出流缓冲写出文件:(从内存中写入到硬盘中)

1、找到对应的文件,创建对应文件File类对象。
2、创建一个FileOutputStream文件输出字节流对象
3、使用FileOutputStream这个对象创建对用的BufferedOutputStream对象
4、写入数据 write
5、关闭流

示例:

import java.io.*;

/**
 * @author xue_yun_xiang
 * @create 2021-03-18-17:47
 */
public class Demo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/JAVA/qianfeng/2.txt");
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        /*
         *写入数据
         * write(byte[] )写一个字节数组到指定的磁盘中
         * */
        String s = "中午吃满汉全席";
        String str = s;
        byte[] bytes = str.getBytes();
        bos.write(bytes);
        bos.close();
    }
}

运行结果:
在这里插入图片描述

字符输入流缓冲读取文件:

1、找到对应的文件 File类对象
2、创建FileReader对象字符输入流
3、根据FileReader对象创建BufferedReader 字符输入缓冲对象
4、读取数据
5、关闭流

示例:

import java.io.*;

/**
 * @author xue_yun_xiang
 * @create 2021-03-18-19:15
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {
        //1.创建一个File对象
        File file1 = new File("E:/JAVA/qianfeng/1.txt");
        //2.创建FileReader字符输入流对象
        FileReader fileReader = new FileReader(file1);
        //3.创建一个字符缓冲输入流
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        //3.读取文件
        /*
        int read():读取一个字符
        int read(char[] buf):读取数据存入到char类型的数组里面并返回读到的字符的个数
        String readLine():读取一行数据
         */
        char[] chars = new char[1024];
        int len = bufferedReader.read(chars);
        System.out.println(new String(chars, 0, len));

        //System.out.println(bufferedReader.readLine());

        bufferedReader.close();

    }
}

输出结果:

哈哈哈哈哈哈哈
哈哈哈哈哈哈哈

字符输出流缓冲写出文件:

1、找到对应的文件 File类对象
2、创建FileWriter对象字符输出流
3、根据FileWriter对象创建BufferedWriter 字符输出缓冲对象
4、写入数据
5、关闭流

示例:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**

  • @author xue_yun_xiang
  • @create 2021-03-18-19:32
    /
    public class Demo2 {
    public static void main(String[] args) throws IOException {
    File file = new File(“E:/JAVA/qianfeng/2.txt”);
    FileWriter fileWriter = new FileWriter(file);
    BufferedWriter bw = new BufferedWriter(fileWriter);
    /

    1、void write(int char)写入一个字符到文件中
    2、void write(char[] cbuf)写入一个字符数组到文件中
    3、void write(char[] cbuf,int off,int len)写入一个字符数组到文件中,并且限制了开始和长度
    4、void write(String str)写入一个字符串到文件中
    5、void write(String str int off,int len)写入一个字符串到文件中,并限制了开始和长度
    6、void newLine()换行写
    */
    bw.write(“下午喝小米粥”);
    bw.newLine();
    bw.write(“反差有点,接受不了”);
    bw.close();
    }
    }
    运行结果:
    在这里插入图片描述

【注意事项】:使用字节流处理图片音频视频等,不要用字符流有可能出错。字符流用来处理文本。

四、综合示例

复制一个视频文件

可能出现的问题:拒绝访问
原因:文件写出的时候必须指明具体的文件名,不能只是文件夹

import java.io.*;

/**
 * @author xue_yun_xiang
 * @create 2021-03-18-13:46
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {
        copy1();
    }

    public static void copy1() throws  IOException {

        long start = System.currentTimeMillis();

        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("E:/JAVA/1.avi")));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("E:/JAVA/2.avi")));


        byte[] b1 =new byte[1024];
        int len;
        while ((len = bufferedInputStream.read(b1)) != -1) {
            bufferedOutputStream.write(b1,0,len);
        }

        bufferedOutputStream.close();
        bufferedInputStream.close();

        long end = System.currentTimeMillis();

        System.out.println("time:" + (end - start));
    }
}

输出结果:

time:1228

版权声明:本文为xue_yun_xiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。