欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中的Io操作

程序员文章站 2022-03-25 10:56:53
I(Input)\O(Outpyt)1)什么是IO IO:input,Output java 标准的输入与输出 javaIO是以标准的操作对外界设备进行数据交换并将读写分为输入与输出 IO是顺序读写方式,只能顺序向后进行读或写操作,并且不能同时进行读和写操作2)为什么需要IO 功能上与RandomAccessFile一样,但是RAF是瑞吉读写模式,而文件流是顺序读写形式 对于读写的灵活度而言不如RAF,但是基于流链接可以完成复杂数据的读写......

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