字节流+封装流+数据流+字符流+Reader & Writer+PrintWriter+缓冲流+序列化

字节流:可以从或向一个特定方向读写数据,读写字节数据

封装流/处理流:针对字节流进行封装,即一个已经存在的流进行封装

                            通过封装流能够对数据更有效的读写,封装流的底层还是字节流

         通常字节流被称为低级流

         处理流被称为高级流或者过滤流

 

InputStream:

字节流:可以从或向一个特定方向读写数据,读写字节数据

封装流/处理流:针对字节流进行封装,即一个已经存在的流进行封装

                     通过封装流能够对数据更有效的读写,封装流的底层还是字节流

       通常字节流被称为低级流

       处理流被称为高级流或者过滤流

 

InputStream:

       所有的字节流的父类,其定义了基础的读取方法

  -int read()

       读取一个字节,以int的形式返回,该int的低八位有效

       否则返回-1,表示文件末尾EOF  end of file

  -int read(byte[] buf)

       尝试最多读取给定数组length(数组长度)个字节,并存入该数组

       返回值为实际读取的字节量的长度,否则返回-1

  -int read(byte[] buf,int offset,int len)

       将输入流中的最多len个字节写入byte数组

       将从offset的 位置开始写入数组,len不能超过数组的实际长度

       超过数组的实际长度会报数组下标越界异常

  -void close()

       关闭此输入流,释放与该流关联的所有系统资源

OutputStream:所有字节流的父类,其定义了基础的写出方法

  -void write(int d)   写出整型数据的低八位

  -void write(byte[] b)  将给定的字节数组的数据全部写出

  -void write(byte[] b,int offset,int len)

      将给定的字节数组从偏移量offset开始的len个字节写入输入流

  -void flush() 刷新此输出流,并强制写出所有缓冲的输出字节

  -void close()  关闭此输出流,并释放与此输出流的相关所有系统资源

 

FileInputStream:文件输入流

  -操作文件内容,

-操作的是字节流

-继承自InputStream抽象类

-低级流,操作的是文件

FileOutputStream:文件输出流

  -操作文件内容

  -操作的是字节流

  -继承自OutputStream抽象类

  -低级流,操作的是文件

 

缓冲流:Buffer缓冲  高级流之一

缓冲流的原理:

    向硬件存储设备操作数据,导致增大跟硬件的交互次数,

       会降低读写的速度,做缓冲流的目的就是为了尽量减少

       跟硬件的交互次数

 

  缓冲输出流原理:BufferedOutputStream缓冲输出流内部会维护

    一个缓冲区,每当我们向该流写出数据时,都会先将数据存入缓冲区

       当缓冲区已满的时候,缓冲流会将数据一次性写出

      

       注意:

           void flush(),清除缓冲区,将缓冲区中的数据强制写出

               以保证数据完整

 

  缓冲输入流原理:BufferedInputStream缓冲输入流内部维护一个

    缓冲区,每当我向该流读入数据,都会先将数据存入缓冲区,

    BufferedInputStream的read方法会从缓冲区去读取数据,

       当缓冲区全都读取完毕,如果再次read的时候,会在一次

       把缓冲区填满,read在逐一从从缓冲区中读取数据,以此往复

缓冲是靠牺牲内存来提升io的读写效率的

案例:

      

 

数据流: 高级流之一

       DataInputStream:数据输入流,适合对java基本类型的输入

              构造函数:

                     DataInputStream(InputStream)

              Api方法:

                     readInt();

                     类似的方法  readXXX();//XXX代表具体类型

       DataOutputStream:数据输出流,适合对java基本类型的输出

              构造函数:

                     DataOutputStream(OutputStream)

              Api方法:

                     writeInt();

                     类似的方法:writeXXX();//XXX代表具体类型

 

字符流:

       针对字节流做低级流的二次或者三次封装或者处理

       字符流的本质还是字节流

-Reader类:

       -所有字符流的父类

       -是一个抽象类

  -int read()

       读取一个字符,占用整个整型数据的低16位,低16位有效(因为char占用两个字节)

-int read(char[] chars)

       从流中读取一个字符数组长度个字节,并存储到该字符数组中

       返回的是实际读取的字符量

  -int read(char[] chars,int offset,int len)

       读取len个字符,存储到字符数组,以offset为起点

 

-Writer类

       所有字符流的父类

       是一个抽象类

  -void write(int c)

       写出一个字符

  -void write(char[] chars)

       写出一个字符数组的数据

  -void write(chars[] chars,int offset,int len)

       从字符数组写出数据,从offset开始,取len个字符

  -void write(String str)

       写出一个字符串

  -void write(String str,int offset,int len)

       写出字符串中的部分数据,指定从offset开始,长度为len

-InputStreamReader类

       可以设置字符集

       按照指定的字符集输入数据

       将字节按照指定的字符集写出字符串数据

       继承自Reader类

OutputStreamWriter类

       可以设置字符集

       按照指定的字符集输出数据

       将字节按照指定的字符集写出字符串数据

       继承自Writer类

缓冲字符流:  缓冲字符流自己维护一个字符数组

-BufferedReader类:缓冲字符流输入

       String readLine();//读取一行数据,读取到文件末尾为null

-BufferWriter类: 缓冲字符流输出

PrintWriter类:

       特殊的类,只有输出,没有输入

       具有自动刷新的缓冲字符输出流

对象流  高级流之一

       把内存的对象数据序列化到硬盘上,也可以把硬盘上的文件反序列化回内存的对象

 

序列化:

       把内存的对象序列化到硬盘上,以字节的方式体现

 

反序列化:

       把硬盘上的字节序列,反序列化为内存中的对象

 

比如:

       Student stu = new Student("张三",20,"s001");

       stu-->硬盘(序列化)-->内存堆中出现stu对象(反序列化)

      

注意:

       实现对象的序列化合反序列化,就必须对序列化的对象

       所对应的类实现java.io.Serializable接口

       且类中最好给提供一个long类型的序列化版本号

       比如:

              public class Student implements Serializable{

                     private static final long serialVersionUID = 1L;

                     //filed 属性

                     //method   方法

              }

 

java.io.Serializable接口

       子接口仅表示可序列化的语义,某各类实现了这个接口,表示此类可以被序列化,这个类的子类也可以被序列化

       这个类需要提供一个常量serializableUID,用来表示本类的序列化版本号

       如果想跨平台,就需要显示声明一个版本号

       且平台两端的版本必须相同

      

       序列化的类中可以有很多的属性,但是部分属性是不想被序列化和反序列化的

把类中不需要序列化的属性加上transient修饰符

       transient:原意是瞬间的,短暂的,临时的

比如:

      

 

         所有的字节流的父类,其定义了基础的读取方法

  -int read()

         读取一个字节,以int的形式返回,该int的低八位有效

         否则返回-1,表示文件末尾EOF  end of file

  -int read(byte[] buf)

         尝试最多读取给定数组length(数组长度)个字节,并存入该数组

         返回值为实际读取的字节量的长度,否则返回-1

  -int read(byte[] buf,int offset,int len)

         将输入流中的最多len个字节写入byte数组

         将从offset的 位置开始写入数组,len不能超过数组的实际长度

         超过数组的实际长度会报数组下标越界异常

  -void close()

         关闭此输入流,释放与该流关联的所有系统资源

OutputStream:所有字节流的父类,其定义了基础的写出方法

  -void write(int d)   写出整型数据的低八位

  -void write(byte[] b)  将给定的字节数组的数据全部写出

  -void write(byte[] b,int offset,int len)

        将给定的字节数组从偏移量offset开始的len个字节写入输入流

  -void flush() 刷新此输出流,并强制写出所有缓冲的输出字节

  -void close()  关闭此输出流,并释放与此输出流的相关所有系统资源

 

FileInputStream:文件输入流

  -操作文件内容,

-操作的是字节流

-继承自InputStream抽象类

-低级流,操作的是文件

FileOutputStream:文件输出流

  -操作文件内容

  -操作的是字节流

  -继承自OutputStream抽象类

  -低级流,操作的是文件

 

缓冲流:Buffer缓冲  高级流之一

缓冲流的原理:

    向硬件存储设备操作数据,导致增大跟硬件的交互次数,

         会降低读写的速度,做缓冲流的目的就是为了尽量减少

         跟硬件的交互次数

 

  缓冲输出流原理:BufferedOutputStream缓冲输出流内部会维护

    一个缓冲区,每当我们向该流写出数据时,都会先将数据存入缓冲区

         当缓冲区已满的时候,缓冲流会将数据一次性写出

        

         注意:

             void flush(),清除缓冲区,将缓冲区中的数据强制写出

                    以保证数据完整

 

  缓冲输入流原理:BufferedInputStream缓冲输入流内部维护一个

    缓冲区,每当我向该流读入数据,都会先将数据存入缓冲区,

    BufferedInputStream的read方法会从缓冲区去读取数据,

         当缓冲区全都读取完毕,如果再次read的时候,会在一次

         把缓冲区填满,read在逐一从从缓冲区中读取数据,以此往复

缓冲是靠牺牲内存来提升io的读写效率的

案例:

        

 

对象流  高级流之一

         把内存的对象数据序列化到硬盘上,也可以把硬盘上的文件反序列化回内存的对象

序列化:

         把内存的对象序列化到硬盘上,以字节的方式体现

 

反序列化:

         把硬盘上的字节序列,反序列化为内存中的对象

 

比如:

         Student stu = new Student("张三",20,"s001");

         stu-->硬盘(序列化)-->内存堆中出现stu对象(反序列化)

        

注意:

         实现对象的序列化合反序列化,就必须对序列化的对象

         所对应的类实现java.io.Serializable接口

         且类中最好给提供一个long类型的序列化版本号

         比如:

                   public class Student implements Serializable{

                            private static final long serialVersionUID = 1L;

                            //filed 属性

                            //method 方法

                   }

 

java.io.Serializable接口

         子接口仅表示可序列化的语义,某各类实现了这个接口,表示此类可以被序列化,这个类的子类也可以被序列化

         这个类需要提供一个常量serializableUID,用来表示本类的序列化版本号

         如果想跨平台,就需要显示声明一个版本号

         且平台两端的版本必须相同

        

         序列化的类中可以有很多的属性,但是部分属性是不想被序列化和反序列化的

把类中不需要序列化的属性加上transient修饰符

         transient:原意是瞬间的,短暂的,临时的

比如:

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值