Java总结08 IO体系之 字节流的输出流(写入)与输入流(读取)的概念与应用

在这里插入图片描述

一.写入 又称:输出流

1.2创建

:
1/不带追加的格式:FileOutputStream 自定义对象名 = new FileOutputStream(字符串路径或File对象)
列如:FileOutputStream fileOutputStreamObj = new FileOutputStream("day08-Senior-code/test.txt");

2/带追加的格式:
FileOutputStream 自定义对象名 = new FileOutputStream(字符串路径或File对象,true/flash);
列如:FileOutputStream fileOutputStreamObjTwo = new FileOutputStream("\\testTwo.txt", true );
区别
1/不带追加格式: 对某个文件写入数据时,会直接先清空(也可以理解为覆盖)所有数据.
2/带追加格式: 对某个文件写入数据时,不会覆盖原有的数据.但是追加规则有二种
规则一:如果参数为true,则每次写入的数据追加到文件末尾;
规则二:如果参数为flash,则每次写入的数据追加到文件最前.

注意:
1/如果文件已经存在,则new对象时不覆盖.
2/执行写入操作后,需要用close进行资源释放,如果不释放,文件将会被一直占用.

1.3写入数据

换行符:
如果你写入的是一个字符串文本,你想要在这里头进行换行操作,那么就需要用到一些符号.
换行符因系统不同而不同:
Windows为:\r\n
Linux为:/n
Mac为:/r

方式一:整数型Unicode码直写

格式1:对象名.write(码表所对应的int值);
列如:fileOutputStreamObj.write(5361);

方式二:直接以底层byte字节集表示
步骤1/声明byte数组
格式:byte[] 自定义变量名 = "字符串".getBytes();
列如:byte[] byteArray = “zhongguo”.getBytes();
步骤2/写入内容
格式:对象名.write(byte变量名);
列如:fileOutputStreamObj.write(byteArray);

方式三:取指定的byte字节集.
步骤1/声明byte数组
格式:byte[] 自定义变量名 = "字符串".getBytes();
列如:byte[] byteArrayTwo = “yongyuanheping”.getBytes();
**步骤2/**定义要取的内容,并写入
格式:对象名.write(byte变量名,起始位置,取字节的数量); 取指定的byte字节集.
列如:fileOutputStreamObjTwo.write(byteArrayTwo, 3, 6);
解释:
1/先将字符串转换为一组一组的字节集,并用byte数组保存这些’一组一组的字节集’
然后输入参数去取指定内容的字符串,接着根据字符串的索引值获取byte数组中其对应着的byte字节集元素.
2/起始位置的初始索引值以0计算,起始位置的索引值包括其对应的元素,
列如此处’byteArrayTwo’byte数组变量的内容为’yongyuanheping’.而括号内为3,
依照以0为初始位置,索引值’3’对应的就是’g’.
2/而’6’表示要取的数量,初始索引值为1,初始位置为索引值所对应的位置,
那么此处所取的内容就是g(1)y(2)u(3)a(4)n(5)h(6)

1.3释放资源

格式:对象名.close();

二.读取 又称:输入流

1/创建对象 - 开启读入流管道

格式: FileInputStream 自定义对象名= new FileInputStream(字符串路径或File对象);
列如: FileInputStream fileInputStreamObj = new FileInputStream("\InputTest");

2/读取

格式:自定义对象名.read();
列如:fileInputStreamObj.read();
注意:
1/read方法的括号内不需要参数,每调用一次就会读取一个字节数据,因此想要完全读取下来,需要用到循环.
1/每次调用都会返回一个Int值,如果int值为’-1’则说明这是个空数据.不为’-1’则说明是个字节集数据.

3/释放资源 - 关闭读入流管道 close
格式:自定义对象名.close();
列如:fileInputStreamObj.close();

三.字节流的缓冲流(推荐多用)

缓冲流意义:
缓冲流的[缓冲输入流]和[缓冲输出流]之方法跟普通的输入流输出流方法没什么区别,但是底层逻辑不同.
缓冲流对大文件的读取,或大文件的数据写入时,能提高效率.
使用:字节流之缓冲流的方法名称与其用法几乎与普通的字节流无异.

1/缓冲输入流的创建

第一种方式 — 包裹匿名对象式创建:
格式:BufferedInputStream 自定义对象名 = new BufferedInputSteam(new FileInputSteam(路径/File对象));
列如:BufferedInputStream bufferedInputStreamObj = new BufferedInputStream(new FileInputStream(“C:\Users\1\Pictures\”));
第二种方式 — 分离式创建:
步骤一/格式:FileInputStream 自定义原始输入流对象名 = new FileInoutStream(路径/File对象);
步骤一/列如:FileInputStream fileInputStreamObj = new FileInputStream(“C:\Users\1\Documents\aaacc - 副本.txt”);

步骤二/格式:BufferedInputStream 自定义缓冲输入流对象名 = new BufferedInoputStream(自定义原始输入流对象名);
步骤二/列如:BufferedInputStream bufferedInputStreamObjTwo = new BufferedInputStream(fileInputStreamObj);

2/缓冲输出流的创建

在这里插入图片描述
在这里插入图片描述
第一种方式 — 包裹式匿名对象式创建:
格式:BufferedOutputStream 自定义对象名 = new BufferedOutputStream(new FileOutputStream(路径/File对象));
列如:BufferedInputStream bufferedInputStreamObj = new BufferedInputStream(new FileInputStream(“C:\Users\1\Pictures”));
第二种方式 — 分离式创建:
步骤一/格式:FileOutputStream 自定义原始输出流对象名 = new FileOutputStream(路径/File对象);
步骤一/列如:FileOutputStream fileOutputStreamObj = new FileOutputStream("\bufferedOutputStream - 副本.txr");

步骤二/格式:BufferedOutputStream 自定义缓冲输出流对象名 = new BufferedOutputStream(自定义原始输出流对象名);
步骤二/列如:BufferedOutputStream bufferedOutputStreamObjTwo = new BufferedOutputStream(fileOutputStreamObj);

3/缓冲流的一个特殊方法

在这里插入图片描述
缓冲输出流对象名.flush();
顾名思义,这是一个刷新的方法.
它刷新的是被写入文件的缓冲数据,因为每次用缓冲输出流的write方法进行数据写出后,数据的’缓冲区’就需要缓存新的数据,所以这个时候就需要刷新缓冲区了.
保险起见,还是在每次用write语句刷新后用上它.
如果不用它,那么在调用释放资源的’close’方法时,close方法会自动触发’flush’的刷新机制.

四.复制多媒体文件的固定格式

   byte[] byte数组变量 = new byte[1024];
        int 被充填了的数组数量之变量;
        while ((被充填了的数组数量之变量 = 输入流对象.read(byte数组变量)) != -1) 
            输出流变量.write(byte数组变量, 0, 被充填了的数组数量之变量;    
                                                                     }

列如:

     byte[] byteArray = new byte[1024];
        int lengthInt;
        while ((lengthInt = fileInputStreamObj.read(byteArray)) != -1) {
            fileOutputStreamObj.write(byteArray, 0, lengthInt);
        }

讲解:
byte数组在read方法的括号内,其目的是要将读取到的数据元素充填到byte数组的个个数组里头.
而后read方法返回一个数值,这个数值标识的是其数组变量中有多少个数组充填了元素.
lengthInt就是接收这个read返回的数值.这样子的话,就可以运用write(byte变量,0, 数组长度)这个形式来输出字节;
此时lengthInt这个变量就可用来表示其中的’数组长度’了
这么做的
好处是:可以准确输出数据,不必输出不必要的空数据
.如果不这样做,那多媒体文件也是可以用的,但是文件大小要比这个大

缓冲流演示类BufferedOutputAndInputStream.java

public class BufferedOutputAndInputStream {
    public static void main(String[] args) throws IOException {
      //创建 第一种方式 包囊式

        //创建缓冲输入流 读写流
        BufferedInputStream bufferedInputStreamObj = new BufferedInputStream(new FileInputStream("D:\\传智播客感恩节短片.mp4"));

        //创建缓冲输出流 写入流
        BufferedOutputStream bufferedOutputStreamObj = new BufferedOutputStream(new FileOutputStream("\\bufferedOutputStream.avi"));

        //写入数据 单个
        bufferedOutputStreamObj.write("china".getBytes());

        //复制多媒体文件
        byte[] byteTemp = new byte[1024];
        int lengthInt;
        while ((lengthInt = bufferedInputStreamObj.read(byteTemp))!=-1){//每次读取数据都会将数据元素充填到byte数组,每个数组最大128字节,如果没有任何元素被充填,则返回-1,视为无数据.
            bufferedOutputStreamObj.write(byteTemp,0,lengthInt);

 bufferedOutputStreamObj.flush();//保险起见,每输入一次数据,进行一次刷新.
        }

        //释放资源
        bufferedOutputStreamObj.close();

     //创建 第二种方式 分离式
        //创建缓冲输入流 读写流
        FileInputStream fileInputStreamObj = new FileInputStream("C:\\Users\\1\\Documents\\aaacc - 副本.txt");
        BufferedInputStream bufferedInputStreamObjTwo = new BufferedInputStream(fileInputStreamObj);

        //创建缓冲输出流 写入流
        FileOutputStream fileOutputStreamObj = new FileOutputStream("\\bufferedOutputStream - 副本.txr");
        BufferedOutputStream bufferedOutputStreamObjTwo = new BufferedOutputStream(fileOutputStreamObj);



    }
}

输出流演示类OutPutIo.java

public class OutPutIo {
    public static void main(String[] args) throws IOException {


        //创建并打开字节输入流(即对其写入数据流)   "\\test.txt" d:\test.txt
        FileOutputStream fileOutputStreamObj = new FileOutputStream("\\test.txt");
        //此处new对象有3个动作,1/判断目标文件是否存在,如果存在则不创建,反之则创建.
        //                     2/启动输入流
        //                     3/将对象指针指向其括号内路径中的文件.

        //以字节形式写入数据.如果该文件本就存在,将直接覆盖为写入的内容.
        //方式1 插入字符(?)
        fileOutputStreamObj.write(5361);//其实是Unicode码

        //方式2 插入全部byte字节流
        byte[] byteArray = "zhongguo".getBytes(); //将每个字符转为其对应的码(可以是Unicode,也可以是ASCII,总之当作Byte数据类型存入里头)
       fileOutputStreamObj.write(byteArray);
       
        //追加写入 格式:FileOutputStream 自定义对象名 = new FileOutputStream(字符串路径或File对象,true/flash);
        FileOutputStream fileOutputStreamObjTwo = new FileOutputStream("\\testTwo.txt", true );
        
        //方式3  插入指定byte字节流
        byte[] byteArrayTwo = "yongyuanheping".getBytes();
        fileOutputStreamObjTwo.write(byteArrayTwo, 3, 6);//gyuanh
        //换行
        fileOutputStreamObjTwo.write("\r\n".getBytes());
        fileOutputStreamObjTwo.write("世界の平和を望んでいる".getBytes());
        //释放资源 关闭输出流以解除占用.
        fileOutputStreamObj.close();
    }
}

输入流演示类:InPutIo.java

public class InPutIo {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStreamObj = new FileInputStream("\\InputTest.txt");
        //读取内容 越读取越靠后,获取的原始数据为int类型.如果读到了文件最后(也就是没有了),则返回的数值为'-1'.
        int read =  fileInputStreamObj.read();
       while ((read = fileInputStreamObj.read())!=-1){
           System.out.println((char) read);//将其从int强制转换为char
       }
       //释放资源 关闭读取流以解除占用
       fileInputStreamObj.close();
    }
}

应用:文本文件/多媒体文件的复制

在这里插入图片描述

实现:1/读入某个txt文件内容,创建一个文件,将其写入到该文件内容.
2/将某个多媒体文件(如图片)复制到另一处.
目的:锻炼IO的写入(Output)和读入(Input).

public class InputAndOutputOfIo {
    public static void main(String[] args) throws IOException {

 //=============================复制文本文件===================================
        //创建读入流
        FileInputStream fileInputStreamObj = new FileInputStream("\\test.txt");

        //创建输出流
        FileOutputStream fileOutputStreamObj = new FileOutputStream("\\paramOutput.txt");

        int intOfInputParam;


        //开始读取数据,但是想要得到数据内容,还需要转换,这个过程为
        while ((intOfInputParam=fileInputStreamObj.read())!=-1){

            System.out.println((char)intOfInputParam);


            fileOutputStreamObj.write(intOfInputParam);



        }


        //复制完毕后,再在接收文件内插入字符串内容.这个过程需要转换,顺序为: String字符串 ----> Byte数组
        byte[] stringOutput = "写入成功!".getBytes();

        fileOutputStreamObj.write(stringOutput);
        System.out.println("====================================");


//=============================复制其它文件(如多媒体)===================================

                   media();
    }

   //复制图片
    public static void media() throws IOException {
        //创建读入流
        FileInputStream fileInputStreamObj = new FileInputStream("C:\\Users\\1\\Pictures\\暴风截图20191119246824265.jpg");

        //创建输出流
        FileOutputStream fileOutputStreamObj = new FileOutputStream("\\JAVA复制版本暴风截图20191119246824265.jpg");


   //读入
        byte[] byteArray = new byte[1024];//定义一个长度为1024的静态byte型数组.
        int lengthInt;
        while ((lengthInt = fileInputStreamObj.read(byteArray)) != -1) { //read方法的括号内,其目的是要将读取到的数据元素充填到byte的个个数组里头.
            fileOutputStreamObj.write(byteArray, 0, lengthInt);     //而后read方法返回处一个数值,这个数值标识的是其数组变量中有多少个数组充填了元素
                                                                         //而lengthInt就是接收这个read返回的数值.这样子的话,就可以运用write(byte变量,索引值, 数组长度)这个形式来输出字节;
                                                                         //此时lengthInt这个变量就可用来表示其中的'数组长度'了
                                                                         //这么做的好处是:可以准确输出数据,不必输出不必要的空数据.如果不这样做,那多媒体文件也是可以用的,但是文件大小要比这个大
        }

        System.out.println("复制完成!");
        fileInputStreamObj.close();//关闭读取流
        fileOutputStreamObj.close();//关闭写入流


    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值