IO流(字节流 / 字节缓冲流)

IO流概念

IO: 输入/输出 (input  /  output)

流: 是一种抽象概念,是对数据传输的总成,也就是说数据在设备间的传输称之为流, 本质就是数据传输

IO流是用来处理设备间数据传输的,常见用于: 文件复制,文件上传,文件下载

IO流的流向分为两种: 输入流 输出流

IO流传输的数据类型分为两种: 字符流  字节流

如果是操作纯文本文件,优先使用字符流

图片,视频,音频,不确定文件类型使用字节流

字节输出流:  (进行写数据)

创建对象方法:

FileOutputStream(String name):        创建文件输出流以指定的名称写入文件

写数据方法:

void write(int b)          将指定的字节写入此文件输出流 一次写一个字节数据

void write(byte[] b)             

         将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据

void write(byte[] b, int off, int len)

        将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

换行指令:

  • windows:\r\n

  • linux:\n

  • mac:\r


        //创建字节输出流对象 指向路径c:\\aaa.txt的aaa.txt文件(也就是将数据输出到aaa.txt文件夹)
        FileOutputStream fos = new FileOutputStream("c:\\aaa.txt");

        //将指定的字节写入 一次写入一个字节数据
        fos.write(2);   //int类型的可以直接传入
        fos.write("张三".getBytes());     //其他数据类型需要调用getBytes方法转换成字节类型

        //将指定的数组写入 一次写入一个字节数组数据
        byte[] bytes = new byte[1024];
        fos.write(bytes); //一次写入一个bytes数组字符数据

        //将指定的数组写入 可以指定写入范围
        byte[] bytes1 = new byte[1024];
        fos.write(bytes1,0,100); //一次写入一个bytes1数组个数组的数据,范围是从0索引开始,100个字节数据

        //最后进行关流
        fos.close();

字节输入流:  (进行读数据)

创建对象方法:

FileInputStream(String name):参数传入一个文件的路径名,来和这个文件建立链接,进行读取这个文件

读取数据方法:

int read()         一次读取一个字节,int类型的返回值代表读到的字节,若返回值是-1,代表读完了

int read(byte b [ ])         一次读取一个字节数组,返回值代表读到的字节个数,读到的内容保存到数组" b "中,若返回值是-1,代表数据读完.

//创建字节输入流对象 指向路径D:\\bbb.txt 代表读取bbb.txt这个文件中的数据
        FileInputStream fis = new FileInputStream("D:\\\\bbb.txt");

        //int read()方法一次读取一个字节,返回值i代表读取的字节,若是-1代表读完
        int i;  //配合循环实现循环读取数据,直到数据读完停止
        while ((i = fis.read()) != -1) {
            System.out.println((char) i);     //此时的i是字节,转换成字符方便阅读
        }

        //int read(byte b []) 方法一次读取一个字节数组,返回值是读取到的字节个数, 若返回值是-1 代表读取完毕
        int len;    //配合循环实现循环读取数据,直到数据读完停止
        byte[] bytes2 = new byte[1024];
        while ((len = fis.read(bytes2)) != -1) {
            //使用循环把读取的数据放进字节数组中
            //再把字节数组转换成String类型,参数以此是要转换的数组,转换起始位置索引, 转换的个数
            System.out.println(new String(bytes2, 0, len));
        }

字节流复制文件实现 

  • 案例需求

    把“D:\\ddd.jpg”复制到C盘下的“aaa.jpg” (文件可以是任意文件夹)

  • 实现步骤

    • 根据数据源创建字节输入流对象

    • 根据目的地创建字节输出流对象

    • 读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)

  • 释放资源

    //创建字节输入流准备读取D:\\ddd.jpg文件
            FileInputStream fis = new FileInputStream("D:\\\\ddd.jpg");
    
            //创建字节输出流,关联C:\\aaa.jpg文件, 准备将数据复制到这个文件
            FileOutputStream fos = new FileOutputStream("C:\\\\aaa.jpg");
    
            //使用循环将D盘下的文件读取出来,并写入C盘下,实现对文件的复制
            
            //第一种方法,一个字节一个字节的复制
            int a;
            while ((a = fis.read()) != -1) {  //使用fis.read()读取一个字节,赋值给a
                fos.write(a);   //使用fos.write() 写入字节 a 
            }
    
            //第二种方法. 一个字节数组一个字节数组的复制 效率提升
            int len;    //len用来接收一次一共读取到多少个字节
            byte[] bytes = new byte[1024];
            while ((len = fis.read(bytes)) != -1) {  //使用fis.read(bytes) 一次可以最多读取一个1024数组长度的字节,
                fos.write(bytes, 0, len);   //将读取到的字节数组写入字符输出流, 从0索引开始,写入len个字节
            }
            
            //操作完毕进行关流
            fis.close();
            fos.close();

 字节缓冲流:

概念:

       缓冲流其实就是java帮我们创建了一个长度为8192字节的数组,我们调用缓冲流可以一次将8192个字节长度的数组读取(写入)到内存中,这样会提高效率

构造方法/创建对象:

BufferedOutputStream(OutputStream out)         

创建字节缓冲输出流对象,参数是一个字节输出流对象

BufferedInputStream(InputStream in)

创建字节缓冲输入流对象,参数是一个字节输入流对象

//创建一个字节缓冲输出流,参数是一个字节输出流,同时关联一个aaa.txt文件, 表示将数据写入这个文件中
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\aaa.txt"));

        //一次写入一个字节数据
        bos.write(1);
        bos.write("张三".getBytes());

        //一次写入一个字节数组
        byte[] bytes = {1, 2, 3, 4};
        bos.write(bytes);

        //关流
        bos.close();
        
        
        
        //创建一个字节缓冲输入流,参数是一个字节输入流,同时关联一个aaa.txt文件, 表示读取这个文件中的数据
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\aaa.txt"));

        //一次读取一个字节
        int a;
        while ((a = bis.read()) != -1) {
            System.out.println((char) a);
        }

        //一次读取一个数组
        int len;
        byte[] bytes1 = new byte[1024];
        while ((len = bis.read(bytes1)) != -1) {
            System.out.println(new String(bytes1, 0, len));
        }
        
        //关流
        bis.close();

 

字节缓冲流复制文件实现 

  • 案例需求

    把“D:\\ddd.jpg”复制到C盘下的“aaa.jpg” (文件可以是任意文件夹)

  • 实现步骤

    • 根据数据源创建字节缓冲输入流对象

    • 根据目的地创建字节缓冲输出流对象

    • 读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)

  • 释放资源

     //创建字节缓冲输入流准备读取D:\\ddd.jpg文件
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\\\ddd.jpg"));
            
    
            //创建字节缓冲输出流,关联C:\\aaa.jpg文件, 准备将数据复制到这个文件
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\\\aaa.jpg"));
            
    
            //使用循环将D盘下的文件读取出来,并写入C盘下,实现对文件的复制
    
            //第一种方法,一个字节一个字节的复制
            int a;
            while ((a = bis.read()) != -1) {  
                bos.write(a);   
            }
    
            //第二种方法. 一个字节数组一个字节数组的复制 效率提升
            int len;    //len用来接收一次一共读取到多少个字节
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {  
                bos.write(bytes, 0, len);   
            }
    
            //操作完毕进行关流
            bis.close();
            bos.close();


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