IO流——字节流的使用

1 篇文章 0 订阅

一、IO流的介绍

  • IO流:指的用来承载数据进出内存的流,【负责把数据从一个地方运输到另一个地方的方式】

  • 作用:运输数据

  • 分类:     

  • 流向:     输入流 和输出流     

  • 性能划分【处理数据的单位】:     字节流 和字符流

  • io流类的使用流程: 

  • 1、导包【IO流的类基本上都jdk提供的类】

  • 2、创建IO流对象并去处理携带来的异常

  • 3、使用IO流对象调用相关的功能对数据进行操作

  • 4、关闭流对象

二、字节流

  - 在使用IO流对数据进行传输的时候以字节为单位操作数据的流就叫做字节流
  • 分类:字节输入流和字节输出流

1、字节输入流【InputStream

介绍:他是字节输入流的顶层父类,是一个抽象类,定义所有字节输入流的共性功能和属性
  • 常用功能:

  • 1、int read():一次读取一个字节数据到内存

  • 2、int read(byte[] bytes):使用字节数组去读取多个字节的内容到内存

  • 3、int available():返回未读取的字节的个数

  • 4、close():关闭流

  • 注意:InputStream类是一个抽象类,不能创建对象,只能是它的子类去使用它的功能,根据设备的不同,对应的子类也不同

  • 最常用的子类文本字节输入流【FileInputStream

FileInputStream

  • 介绍:是InputStream的子类,负责完成内存和磁盘文本文件之间数据的输入交互的操作。输入功能都是InputStream的功能。

  • 构造方法:

  • FileInputStream(File file):创建一个可以读取指定File对象对应的文件的字节输入流对象 FileInputStream(String path):创建一个可以读取指定路径对应的文件的字节输入流对象

  • 注意事项:

  • 1、同一个字节输入流对象每读取一个字节,光标向后移动一位,每次以光标位置去读取 ;

  • 2、所有的字节数读取完毕继续读取的时候得到的是 -1.

代码示例:

public static void main(String[] args) {
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream("Item/mm/miao/tt.txt");
            int read = inputStream.read();
            System.out.println(read);//这样读取的是字节数
            System.out.println((char)read);//须转为字符
            //判断文件中未读取字节的个数
            int available = inputStream.available();
            System.out.println(available);
            //用字节数组去读取文件内容,数组指定大小即可
            byte[] bytes = new byte[1024];
            int read1 = inputStream.read(bytes);
            System.out.println(new String(bytes, 0, read1));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(inputStream != null) {
                //读取完毕,关流
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

2.字节输出流【OutputStream】

介绍:是字节输出流的顶层父类,是一个抽象类,定义了所有的字节输出流的共性功能,

常见的子类:文本字节输出流【FileOutputStream

常用功能:

void write(int b):输出字节内容到指定的目标文件中

void write(byte[] arr):输出字节数组中所有的字节内容到目标文件中

void write(byte[] arr, int offset, int len):输出字节数组中指定范围的字节内容到目标文件中                  offset:输出的字节内容的开始索引值      

             len:输出的字节个数

void close():关闭流

FileOutputStream

  • 概述:文本字节输出流,是OutputStream的子类,负责内存和磁盘文件之间的数据的输出交互的流,功能都是OutputStream的功能

  • 构造方法:

  • FileOutputStream(File file):创建以指定File对象对应的文件为目标文件的字节输出流对象

  • FileOutputStream(String path):创建以指定path路径对应的文件为目标文件的字节输出流对象

  • 注意事项:字节输出流对象创建的时候指定的目标文件不存在,则会自动的给创建文件【前提:文件所在的目录在磁盘真实存在的】 字节输出流对象创建的时候指定的目标文件存在,则会对已经存在的文件进行格式化

代码示例:

public class IoStreamText {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("Item/mm/miao/tt.txt");
            fos.write("afafjsafas".getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

追加续写

输出数据到目标文件时,想要保留文件原有的数据,并在该数据的后面输出数据需要使用到另一个输出流的构造方法【续写功能】

FileOutputStream(String path,boolean b):

FileOutputStream(File file,boolean b): 参数b必须是true,才是追加续写的对象。

FileOutputStream fos = new FileOutputStream("Item/mm/miao/tt.txt", true);

文件拷贝

  • 分析:使用字节输入流把源文件的数据读取到内存中,然后通过字节输出流把读取到的数据原封不动的写出到目标文件 文件中的字节数可能一次读取不完。需要读取多次一直到读取完毕。

  • 注意:每次读取完必须及时的写出去。 一边读一边写需要在循环中完成: 读取的返回值为-1,则读写完毕!

  • 代码示例

    package com.tlc.io.file;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class IoStreamText {
        public static void main(String[] args) {
            //创建一个字节输入流对象---我们一图片拷贝为例
            FileInputStream fis = null;
            //创建一个字节输出流对象
            FileOutputStream fos = null;
            try {
                fis = new FileInputStream("Item/mm/miao/1.jpeg");
                fos = new FileOutputStream("Item/mm/tt.jpeg");
                //创建一个字节数组存储拷贝的数据
                byte[] bytes = new byte[1024];
                //读取文件数据
                int len;
                //使用whlie循环完成拷贝
                while((len = fis.read(bytes)) != -1) {
                    //边读边写,每次写入数组读取的字节
                    fos.write(bytes, 0, len);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fos != null) {
                    try {
                        //后开的输出流先关闭
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis != null) {
                    try {
                        //关闭输入流
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    3.字节缓冲流【字节高效率】

    • 概述:用来对字节流进行提升效率的一个流,本身没有读写的功能,字节缓冲流要想使用前提是必须要有字节流

    • 作用:对字节流进行修饰提效的。

    • 分类:

    • 字节输出缓冲流【BufferedOutputStream】

    • 字节输入缓冲流【BufferedInputStream】

    • 构造方法:

    • BufferedInputStream (InputStream is):创建一个以is为提升目标的字节输入缓冲流对象

    • BufferedOutputStream(OutputStream os):创建一个以os为提升目标的字节输出缓冲流

    • 字节输出缓冲流的特有方法:flush():刷新缓冲区。

    • flush方法和close方法的区别:

    • 1、flush方法只是用来刷新字节输出缓冲流的缓冲区内容的方法,调用之后流对象还可以继续使用;

    • 2、close方法用来关闭流对象,默认先调用flush方法刷新缓冲区后,流对象关闭就不能再继续使用了。

    • 代码示例:

    字节缓冲流高效原理

    • 字节输入缓冲流:

    • 使用字节输入缓冲流读取目标文件中数据的时候,缓冲流对象一次性从目标文件中读取【8192】个字节内容回来之后再在内存中创建一个8192个长的字节缓冲区来存放这些字节,接下来缓冲流在读取内容的时候其实是使用内部字节输入流按照read方法从缓冲区中读取字节进入到内存的目标处。这样减少了读取时内存和磁盘文件的交互次数,从而提效。

    • 字节输出缓冲流:

    • 字节输出缓冲流第一次输出内容的时候,没有把内容直接输入到目标文件中去,先在内存中创建一个8192长的字节缓冲区,使用内部字节输出流按照write方法写出字节数到缓冲区,等缓冲区全部写满,自动的把8192个字节内容一次性的写入目标文件中。 缓冲区如果没有写满,可以调用flush方法将缓冲区内容强制写入目标文件中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值