Io流中字节流的使用.FileOutputStream FileOutputStream BufferedInputStream以及BufferedOutputStream.

1.用字节输出流从内存给磁盘指定文件中录入信息,代码展示如下:

public static void main(String[] args) {
        //创建字节输出流对象
        try {
                //1)如果输出流对象的路径是相对路径,则文件将建在当前目录下
            FileOutputStream fin = new FileOutputStream("kunge.txt");
                //2)输出流对象调方法不用创建数组,因为输出流直接写入内容
            fin.write("dhshfafhdaafh\r\n".getBytes());
            fin.write("fgdxcbvhf\r\n".getBytes());
            fin.write("fhdjhfbckfeyauasohg\r\n".getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结:

1)在创建字节输出流对象时,若果地址写的不是绝对路径,那么将默认在当前项目下创建

2)字节输出流直接用对象调write()方法,直接在方法里写入要输出的数据,不用创建数组,只有在以数组长度为单位读取数据时才需要.

3)在write()方法中输入的数据(你在键盘上输入的是字符串)此时必须将输入的字符串转化为字节数组(.getBytes),因为write(byte[] b) 中的参数为字节数组

2.用字节输入流从将指定文件中的数据打印在控制台上(以指定字符串),代码如下:

public static void main(String[] args) {
        
        try {
            FileOutputStream fout = new FileOutputStream("kunge.txt");
            fout.write("dhshfafhdaafh\r\n".getBytes());
            fout.write("fgdxcbvhf\r\n".getBytes());
            fout.write("fhdjhfbckfeyauasohg\r\n".getBytes());
            fout.write("锄禾日当午,汗滴禾下土".getBytes());
            fout.write("谁知盘中餐,粒粒皆辛苦".getBytes());
            //创建字节输入流对象
            FileInputStream fin = new FileInputStream("kunge.txt");
                //一次读一个长度为1024的数组字符串
            byte[] bytes = new byte[1024];
                //在读取时会将字符串自动转化为对应的字节数组,因此读出的内容为一组数字,因此才能用                len进行接收
            int len = 0 ;
                //当读取的返回值为-1时代表文档中的数据已经被读出完毕
            while ((len = fin.read(bytes))!=-1){
                //将读出的len字节数组转换为ASCII对应的字符串
                System.out.println(new String(bytes,0,len));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结:

1)字节输入流以一定数组长度读取数据时,需要创建固定数组长度(1024)的数组对象,表示一次一行读取(1024)个字节(重点理解一次读取数组长度个字节)

2)字节输入流对象调用read(),一次只读一个字节时,在读到汉字时会出现乱码,原因是字节流对象一次只读一个字节而汉字三个字节.因此当以数组为单位,且数组长度大于3时不会出现乱码

3)当字节输入流对象读入指定文档中的信息时(对象名.read()) 会将读取到的数组长度个字符自动转换为其在ASII中对应的字节数组,因此在控制台上需要将这些字节数组转换为字符串数组

4)理解 字节数组 字符串数组:字符串数组是创建字节输出流时你输入(字节输出流对象.write())到指定文件中的一组字节,而字节数组时创建字节输入流时,将指定文件中的数据以一定数组长度输入到控制台时,IDEA会自动将字符串数组中的字符转换为ASCII中对应的字节数组(是一组字符串对应的ASCII数值)

5)由于字节输入流读出的指定数据为字节数组,因此要将字节数组转换为对应的字符串数组此时sout为三参

3.用字节输入流和字节输出流复制文件

 public static void main(String[] args) {
        try {
            FileInputStream fileInputStream = new FileInputStream("java.txt");
            FileOutputStream fileOutputStream = new FileOutputStream("copy.txt");
            byte[] bytes = new byte[1024];
            int len = 0 ;
            while ((len = fileInputStream.read(bytes))!=-1){
                //写出时自动将字节数组转换为字符数组
                fileOutputStream.write(bytes,0,len);
            }
            fileInputStream.close();
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结:

1)在流中的文件如果不存在则会自动创建该文件,如copy.txt不存在则他会自动创建

2)复制文件的机制是,一边用输入流读取文件一边用输出流写出文件.在while循环中体现

3)在复制案例中,输出流和输入流时两个不同的过程,他们如何建立联系?他们联系的原理是什么?答:它们通过len建立联系,因为len中存储的是读出的字节数组数据.

4)在读出数据的操作中( fileOutputStream.write(bytes,0,len);)len表示读取的数据字节数组,而write会将其转换为字符数组

5)用字节输入流读取数据时,必须得定义int len = 0;并用len进行接收不然会报错

6)在finally中释放内存,一般先释放后建的流对象,再释放先建的流对象 ,且流对象必须声明到外边(直接在main函数中创建流函数的在main函数中声明,在方法中创建流对象的在方法中声明)(如BufferedInputStream bufferedInputStream = null ;),不然不能通过Finally进行释放内存

7)IDEA是个极其敏感的软件,因此必须严格遵守代码语法,以及代码的标准格式

3.用字节缓冲流进行数据的复制(字节缓冲流的复制速度快于字节输入 输出流进行文件复制的速度)代码展示如下:

public static void main(String[] args) {
        copy("D:\\千峰课件\\day06\\源码\\Day06\\src/Demo01.java","D:\\aaa\\bbb/坤坤爱java.java");
    }
    private static void copy(String a,String b){
        //1)在方法中进行声明后方可在finally中释放内存
        BufferedInputStream buin = null ;
        BufferedOutputStream buout = null ;
        //4)以后固定格式必须try catch!!!
        try {
              //2)对于new FileInputStream(a)中a参数不需要在双引号中写,直接将a传进去即可
            buin = new BufferedInputStream(new FileInputStream(a));
             buout = new BufferedOutputStream(new FileOutputStream(b));
                //3)该数组是为输入流而准备
            byte[] bytes = new byte[1024];
                //4)必须用len进行接收
            int len = 0;
            while ((len = buin.read(bytes))!=-1){
                buout.write(bytes,0,len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                buin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                buout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

代码总结:

1)字节缓冲流的参数是对应的字节流对象

2)以后必须将流中的代码进行try catch(即抛出问题(catch)和解决问题(try)),就像标准类一样形成固定格式

3)将缓冲流复制文件的代码提为单独的方法后在finally中释放内存时,必须将流对象申明在方法之中,不然不能释放内存

4)若要在字节缓冲流中的流对象中传参(buin = new BufferedInputStream(new FileInputStream(a)))

直接输入参数即可不必加双引号,且形参中因为是地址值所以类型为字符串!

5)IN往内存中进(从磁盘中往内存中进(控制台)),所以用read()[一参的为读取一个字节 二参的为读取一个字节数组],且每次读取固定长度的字节故IN要用到new byte[],进而要用len接收,而OUT是从内存中往出输出故只用到write()但在复制数据时要和输入流产生关联所以write()[此时write要用三参]

6)在所有的字节流输入流中,若要以字符数组为单位读出数据,必须用len进行接收

7)在main方法中传入实参时必须加双引号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值