Java中的Io操作

2022-07-25,,

I(Input)\O(Outpyt)

1)什么是IO

     IO:input,Output java 标准的输入与输出

     javaIO是以标准的操作对外界设备进行数据交换并将读写分为输入与输出 

     IO是顺序读写方式,只能顺序向后进行读或写操作,并且不能同时进行读和写操作

2)为什么需要IO

     功能上与RandomAccessFile一样,但是RAF是瑞吉读写模式,而文件流是顺序读写形式

     对于读写的灵活度而言不如RAF,但是基于流链接可以完成复杂数据的读写

3)IO的分类

     按方向分:输入流和输出流

     java.io.InputStream:所有字节输入流的超类

       规定了读取字节的相关方法

    java.io.OutputStream:所有字节输入出流的超类

       规定了写出字节的相关方法

    按使用方式分:节点流与处理流,也成为低级流和高级流

    节点流:真是连接数据源与程序之间的”管道“,负责实际搬运数据的流,读写一定是建立在节点流

    的基础上进行的

    处理流:不能独立存在,必须链接在其他流上,使得在读写过程中,当数据流经当前处理流时

    对其做某些加工处理,简化我们对数据的相关操作

    实际应用中我们会串联一组高级流并最终链接到低级流上,使得对数据的读写以流水线式的加

    工读写达到最数据读写的处理。这个过程成为流的链接,也是IO的精髓所在

  1.直接复制:

       直接复制的思路和RandomAccessFile类的思路相似,代码如下:

package io;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

/**

*使用文件流完成文件的复制工作

*

*@author  Administrator

*/

public class CopyDemo1{

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

              /*

             *1:创建文件输入流,用于读取原文件

             *2:创建文件输出流,用于写复制文件

             *3:循环从原文件读取一组字节并写入

             *    到渎职文件中,完成复制工作

             *4:关闭两个流

             */

          FilInputStream fis = new FileInputStream("music.mp3");

          FileOutputStream fos = new FileOutputStream("music_cp2.mp3");

         byte[] data = new byte[1020*10];

         int len = -1;

         while((len = fis.read(data))!=-1 ){

                    fos.write(data,0,len);

         }

         System.out.println("复制完毕");

         fis.close();

         fos.close();

    }

}

  2)使用缓冲流

       如果用上面的操作,就和RandomAccessFile没什么区别了

       其实IO提供了缓冲流来提高复制文件的效率。代码如下:

package io;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

/**

*缓冲流

*java.io.BufferedOutputStream

*java.io.BufferedInputStream

*缓冲流时一对高级流,在流链接中的作用时加快

*数据的读写效率,(它们会将读写的数据统一转换

*为块读写达到效率提高的目的)

*

*@author  Administrator

*/

public class CopyDemo2{

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

              FileInputStream fis = new FileInpitStream("music.mp3");

              BufferedInputStream bis = new BufferedInputStream(fis);

             FileOutputStream fos = new FileOutputStream(music_cp3.mp3);

             BufferedOutputStream fos = new BufferedOutputStream(fos)

             int d = -1;

             long start = System.currentTimeMillis();

             while((d = bis.read())!=-1){

                    bos.write(d);

            }

           long end = System.currentTimeMillis();

           System.out.println("复制完毕!耗时“+(end-start)+"ms");

           bis.close();

           bos.close();

       }

   3.缓冲流的flush方法:

          void flush()

          强制将当前缓冲区中已经缓存的字节一次性写出调用flush方法会立即写出一缓存数据提高数

          据写出的即时行,但是同样增加了实际写出的此时,从而降低写出效率.代码如下:

package io;

import  java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

/**

*缓存输出流写出数据的缓存区问题

*

*@author Administrator

*/

public class BOS_FlushDemo{

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

             FileOutputStream fos = new FileOutputStream("bos.txt");

             BufferedOutputStream bos = new BufferedOutputStream(fos);

            String str = "终是庄周梦了蝶,你是恩赐也是劫”;

            byte[] data = str.getBytes("gbk");

            bos.write(data);

           //    bos.flush();

           System.out.ptintln("写出完毕")

           /*

                缓冲流关闭钱会调用一次flush方法

           */

           bos.close();

       }

}

 

序列化与反序列化

   除了上面的文件复制,java还有一组功能强大的流类型

   对象流

   java.io.ObjectOutputStream

   java.io.ObjectInputStream

   对象流是一对高级流,可以读写Java中任何对象

   对象输出流负责在写出对象的过程中,将对象按照其结果转换为一组字节(对象序列化)

   对象输入流负责在读取对象的过程中将字节还原为对象(对象反序列化)

1.序列化目标Person类

     想要序列化对象,需要使用对象流的void writeObject()方法

     该方法在写出一个对象时有一个前提条件,要求该对象所属的类必须实现序列化接口

     (Serializable)否则会抛出异常

     所有我们序列化的目标类Person必须实现Serializable接口。 代码如下

package io;

import java,io.Serualizable;

import java.util.Arrays;

/**

*使用当前类测试对象流的对象读写操作

*

*@author  Administrator

*/      

public class Person importlements Serializable{

         private static final long serialVersionUID= 1L;

         private String name;

         private int age;

         private String gender;

         private transient String[] otherInfo;

         public Person(String name,int age,String gender,String[] otherInfo)

               super();

               this.name = name;

               this.age = age;

               this.gender = gender;

               this.otherInfo = otherInfo;

     }

     public String getName(){

             return name;          

    }

    public void setName(String name){

             this.name = name;

    }

    public int getAge(){

              return age;

    }

   public void setAge(int age){

          this.age = age;

   }

   public String getGender(){

           return gender;

   }

   public void setGender(String gender){

            this.gender = gender;

   }

   public  String[] getOtherInfo(){

          return otherInfo;

   }

   public void setOtherInfo(String[] otherInfo){

          this.otherInfo = otherInfo;

   }

   public String toString(){

          return name +","+age+","+gender+","+Arrays.toString(otherInfo);

   }

}

2.序列化操作:

     这里流链接的操作分为:

           1.先将给定对象通过对象流写出,此时对象流会将该对象转换为一组字节,这个过程成为

               序列化

          2.序列化后的字节再通过文件流写出了文件。即:写入磁盘中,这个过程成为数据持久化

               对象流是一对高级流,可以读写Java中任何对象

               对象输出流负责在写出对象的过程中,将对象按照

               其结果转换为一组字节(对象序列化)

               对象输出流负责在读取对象的过程中将字节还原

               为对象(对象饭序列化)

3.饭序列化操作

        序列化后的文件可以反序列化为对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文地址:https://blog.csdn.net/zjl0821/article/details/111996910

《Java中的Io操作.doc》

下载本文的Word格式文档,以方便收藏与打印。