IO流(1)字节流

IO流

           我对io流的理解是,io流其实就是对字节码的读取操作,不同的类对字节码的读取操作不一样而已,总之一句话“万物皆01”,这个是自己的理解,意思就是在电脑上存储的不管是文字还是图片或者视频等等, 都是二进制01。

           javaio流的分类(其实在我看来还有一种分法,分为输入流和输出流)

           注意:很多人分不清楚输入和输出,其实输入和输出是以Java程序为参照物,比如InputStream是输入流他是以Java程序为参照物,把系统的资源读进java程序就叫输入,OutputStream输出流就是把Java程序中的数据输出到硬盘中就叫输出流,java中字节流都是以Stream结尾.

               字节流

                        字节输入流(InputStream)接口   所有字节输入流的父类

                                   FileInputStream

                                   BufferedInputStream

                                   ObjectInputStream

                         字节输出流   (OutputStream)接口   所有字节输出流的父类

                                    FileOutputStream

                                    BufferedOutputStream

                                    ObjectOutputStream

                                    PrintStream

                字符流

                         字符输入流(Reader)接口  所有字符输入类的父类

                                   FileReader

                                   BufferedReader

                                   InputStreamReader

                          字符输出流(Writer)接口  所有字符输出类的父类

                                    FileWriter

                                    BufferWriter

                                    OutputStreamWriter

                                    PrintWriter

                 


         字节流

                    按字节为单位读取文件,他只负责读取不会去查码表。

                     先从他们的父类方法介绍,后面再介绍他们特有的方法

        FileInputStream  

               构造方法

                       FileInputStream(File file)               传入一个File对象创建一个字节流

                       FileInputStream(String name)         传入一个文件路径创建一个字节流 

                                  注意:当传入的路径不存在或者传入的为一个文件夹路径,或者传入的File对象所指向的文件不存在或者为文件夹,则会抛出异常。(所有的输入流都会这样)

                 成员方法(以下介绍的字节输入流都具有这些方法)

                            int  read()       如果该方法没有参数则返回一个int值这个值得范围为0~255,读完了返回-1(效率太低不推荐使用)    

                     

 FileInputStream inputStream = new FileInputStream("Day10/aaa.txt");
       int len = 0;
       //循环读取数据
       while ((len = inputStream.read()) != -1){
            System.out.println(len);
        }

                            int  read(byte[]  bytes)    传入一个byte数组加快读取的效率,返回的int值为一次读取了多少个

               

 FileInputStream inputStream = new FileInputStream("Day10/aaa.txt");

        int len = 0;
        //定义数组保存读取的字节,一次输出性读取1024个字节,加快效率
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }

                         void    close()                                       释放系统资源(这个直接调用就是了,所以没有代码了,调用close方法以后的流就无法使用了

               read方法用于读取文件内容和输出流的writer方法集合使用可以实现文件拷贝

               例           

  //创建输入流
        FileInputStream inputStream = new FileInputStream("c:/aaa/aaa.txt");
        int len = 0;   //数组len的初始值
        // 数组数组长度,当条件一定的情况下数组越来越长读取速度越快,
        // 这个是根据你读取的文件大小而定的,文件越来越大数组开大移动比较快,但是不要太大
        // 例   new byte[1024*1024];   常用1024或者1024*8,这个范围内的数字作为数组的长度
        byte[] bytes = new byte[1024];
        //循环读取文件内容,当读取到-1就表示文件读取完毕了
        while ((len=inputStream.read(bytes)) != -1){
             //  把byte数组转为字符串  
            //   bytes = 要转的数组  0=从哪一个索引开始  len=到哪一个索引结束  utf8=以上面编码表转为字符
            System.out.print(new String(bytes,0,len,"utf8"));

            问题

                    为什么read()方法没有参数返回的int值范围在0~255?

                  答:因为InputStream的read()一次读取一个字节,一个字节最大值为255(byte是一个字节范围为(-128~127),但是接收参数的类型为int,int为4个字节,但是读取到的只有一个字节,java虚拟机会默认加上3个字节,3个字节默认全部为0)

  


     FileOutputStream(以下介绍的字节输出流都具有这些方法)

              构造方法
                        
FileOutputStream(File  file,boolean  append)                     根据一个file对象来创建一个字节输出流,

                              当append参数为true时不会清空原来文件的内容,而是在文件末尾追加,否则就会清空文件内容,append 可以不填,默认为false
                         FileOutputStream(String  name,boolean  append)       

                                         根据一个文件路径创建一个字节对象,aapend的作用和上面一个一样

                        注意:如果参数里面的File和路径的文件不存在,创建这对象的时候会默认帮你创建这一个文件,如果是文件夹不存在会抛出异常。

               常用方法

                      void   write(int i)            一次写入一个字节(不推荐使用,效率太低) 

FileOutputStream outputStream = new FileOutputStream("c:/aaa/aaa.jpg");
        //写一个字节到文件中
        outputStream.write(451);
        //关闭流
        outputStream.close();

               void  writer(byte[]  bytes,int  off , int  len)              一次写入一个byte数组,off表示从哪一个索引开始写,len表示写入多少个

  FileOutputStream outputStream = new FileOutputStream("c:/aaa/aaa.jpg");
        byte[] bytes = new byte[1024];
        //这个方法只是用来做示范,byet数组没有值,一般不会这样做,通常和输入流的read方法结合用
        //bytes为要写入的数组  0为要写入的数组开始索引,bytes.length为要写入数组的长度
        outputStream.write(bytes,0,bytes.length);
        //关闭流
        outputStream.close();

 

         BufferedInputStream(字节缓冲输入流)

               介绍:这是一个缓冲流里面有一个默认的byte数组默认长度为8192,保存读取的数据然后一次性写入程序,提高读取效率,

               
                构造方法

                         BufferedInputStream(InputStream  in)             参数需要一个继承InputStream的实现类,提高这个流的效率

               这个和上面介绍的FileInputStream方法差不多,没有上面特别的方法就没有介绍了,只是提高了读取的效率。

 

        BufferedOutputStream(字节缓冲输出流)

                     介绍:这个是和上面对应的,功能也是提高输出流的效率,不过多了一个flush方法

                  构造方法

                           BufferedOutputStream(OutputStream os)                      构造方法需要传入一个字节输出流的子类,提高这个流的效率

                 特有方法

                              void   flush()                       刷新数组把里面的内容输出,  不管数组满了没有,默认数组慢了写入文件,或者是调用了flush和close方法,写入文件,(其实调用close方法底层也是调用了flush方法)      

  BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("c:/aaa/aaa.txt"));
        bufferedOutputStream.write("哈哈哈哈哈".getBytes());
        bufferedOutputStream.flush();

         BufferedOutputStream类注意事项:

                            调用了缓冲流的writer方法不是直接把数据写入到文件里面,而是先存储到缓冲流的数组里面,等数组慢了或者是调用了flush或者colse方法才写入文件里面

   

       问题

         flush和close的区别?

                     flush是刷新缓冲区,调用flush流还可以继续使用

                      close是关闭资源的方法,调用此方法流就不能继续使用了 ,调用close方法他会自动调用flush方法先刷新缓冲区然后再关闭资源。


         ObjectOutputStream(对象输出流)            

                        介绍:该流可以把一个对象写入文件中,然后可以用对象输入流给读出来获取这对象                                               

                         注意:要想把一个类写入文件,这个类必须实现了Serializable接口

                                   如果你把一个类型的对象已经写入了文件,然后修改了这个类的一些东西,然后运行程序把修改以前的对象从文件中读取从来,会爆异常,需要定义一个序列号才可以成功的读取,序列号格式如下

private static final long serialVersionUID = 132456789765L;

                   当你不想把一个属性值写入文件你可以使用用这一个关键字   transient

                    transient关键字用来修饰成员变量,能够保证这个成员变量不被序列化到文件中,也就是反序列化读从来的时候这个属性值为null;

             构造方法

                        ObjectOutputStream(OutputStream  os)         创建该流的对象需要传入一个输出流指定输出文件 

              

              特有方法      

                        void    writeObject(Object   obj)                 写入一个对象到文件中,前提是这个对象的类要实现了Serializable接口

//创建对象输出流对象
      ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("Day11/test.txt"));
      //创建自定义类型对象
        Person person = new Person("老王", 12);
        //调用方法写入文件
        outputStream.writeObject(person);
        //关闭资源
        outputStream.close();

            

               ObjectInputStream(对象输入流)

                     构造方法

                                ObjectInputStream(inputStream  in)                       参数为一个输入流,这输入流关联了对象输出流写入对象的文件

                   特有方法

                             Object    readObject()                           读取对象输出流写入到文件里面的对象,返回一个Object类型,如果需要用到写入对象的特有方法需要强转

        

  //创建对象输入流对象
      ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("Day11/test.txt"));
      //读取对象输出流写入的对象
        Object o = objectInputStream.readObject();
        //关闭资源
        objectInputStream.close();

                  PrintStream(字节打印流)

                                介绍:打印流只有输出流没有输入流,其实他们的底部也是用BufferedWriter和OutputStreamWriter来实现的

                      构造方法

                               PrintStream(File file)                                                 参数为File类型,关联了要输出的文件
                               PrintStream(String fileName)                                     参数为一个文件路径,输入流输入的信息会到这个文件里面

                               PrintStream(OutputStream   out)                                 参数为一个输出流的子类对象

                      特有方法

                          void    print(String  s)              输出一个字符串到文件中,该方法有各种类型参数的重载方法。                        

                      //利用文件路径创建打印流对象
      PrintStream printStream = new PrintStream("c:/aaa/aaa.txt");
      //写入字符串到文件
      printStream.print("哈哈哈哈哈");
      printStream.close();

                      void   println(String  s)                这个方法也有很多重载的方法,这个方法输入一个字符串到文件里,并换一行

  PrintStream printStream = new PrintStream("c:/aaa/aaa.txt");
      //写入字符串到文件并换一行
      printStream.println("哈哈哈哈哈");
      printStream.close();

        字节流常用操作

                                 io流一般是输出流和输入流结合使用,不经常单独使用。

                使用字节流复制文件

                                 

 //创建字节输入流
       FileInputStream fileInputStream = new FileInputStream("c:/aaa/aaa.jpg");
       //创建字节输出流
       FileOutputStream fileOutputStream = new FileOutputStream("d:/aaa/aaa.jag");
       //创建字节数组保存读取的数据,一次读取1024个字节,提高读取效率
       byte[] bytes = new byte[1024];
       int len = -1;
       //循环读取文件,当输入流把文件读取完就返回-1退出循环
       while ((len = fileInputStream.read(bytes)) != -1){
           //字节输出流调用方法保存文件
           fileOutputStream.write(bytes,0,len);
       }
        //关闭输入流
       fileInputStream.close();
       //关闭输出流
       fileOutputStream.close();

                 使用缓冲字节流复制文件

 //创建缓冲输入流
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("c:/aaa/aaa.jpg"));
        //创建缓冲输出流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("d:/aaa/aaa.jag"));
        int len = 0;
        //循环读取文件,输入流调用方法读取,当读取到文件末尾返回-1退出循环
        //由于缓冲流他默认有一个长度为8192的字节数组,所以就不用创建数组保存流
        while ((len = bufferedInputStream.read()) != -1){
            //调用字节输出流保存文件
            bufferedOutputStream.write(len);
        }
        //关闭缓冲输入流
        bufferedInputStream.close();
        //关闭输出流
        bufferedOutputStream.close();

             使用序列流保存对象

       

 //创建序列输入流,指定对象写入的文件
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("Student.txt"));
        //创建序列输出流,指定读取对象的文件
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("Student.txt"));
        //创建对象        注意:如果要序列化一个对象那个对象要实现Serializable接口
        Student student = new Student("老王",45,"男");
        //把对象存储到文件,序列化
        outputStream.writeObject(student);
        //从文件里面读取文件,反序列化 
        //   注意:如果你这个类修改过,你读取你修改前面的,会抛出异常,如果你要修改以后还能读取就要自定义序列号
        //如果要使用这个类特有的方法或者属性需要强转
        Object o = inputStream.readObject();
        //关闭输出流
        outputStream.close();
        //关闭输出流
        inputStream.close();

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值