IO流

基本IO与OS

按照流的方向主要分为输入流和输出流。

数据流按照数据单位的不同分为字节流和字符流。

按照功能可以划分节点流和处理流。

节点流与处理流

按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。

节点流:可以从或向一个特定的地方(节点)读写数据。

处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

 处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

 通常节点流也称为低级流。

通常处理流也称为高级流或过滤流。

输入和输出

什么是输入?

输入是一个从外界到程序的方向,通常为们需要"读取"外界的数据时,使用输入。所以输入是用来读取数据的。

什么是输出?

输出是一个从程序送到外界的方向,通常我们需要"写出"数据到外界时,使用输出,所以输出时用来写出数据的。

输入流

所有的输入流都是InputStream抽象类(字节输入流)和Reader抽象类(字符输入流)的子类。其中ImputStream类是字节输入流的抽象类,是所有字节输入流的父类。

InputStream类中所有方法遇到错误时都会引发IOException异常。

Java的文本输入流Readar类,该类是字符输入流的抽象类,即所有的字符输入流和实现都是它的子类。

常用方法:

int read():从输入流读入一个 8 字节的数据,将它转换成一个 0~255 的整数,返回一个整数,如果遇到输入流的结尾返回 -1。

int read(byte[] b):从输入流读取若干字节的数据保存到参数 b 指定的字芳数组中,返回的字芾数表示读取的字节数,如果遇到输入流的结尾返回 -1。

int read(byte[] b,int off,int len):从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,其中 off 是指在数组中开始保存数据位置的起始下标,len 是指读取字节的位数。返回的是实际读取的字节数,如果遇到输入流的结尾则返回 -1。

void close():关闭数据流,当完成对数据流的操作之后需要关闭数据流。

int available():返回可以从数据源读取的数据流的位数。

skip(long n):从输入流跳过参数 n 指定的字节数目。

boolean markSupported():判断输入流是否可以重复读取,如果可以就返回 true。

void mark(int readLimit):如果输入流可以被重复读取,从流的当前位置开始设置标记,readLimit 指定可以设置标记的字苟数。

void reset():使输入流重新定位到刚才被标记的位置,这样可以重新读取标记过的数据。

注意:

最后 3 个方法一般会结合在一起使用,首先使用 markSupported() 判断,如果可以重复读取,则使用 mark(int readLimit) 方法进行标记,标记完成之后可以使用 read() 方法读取标记范围内的字节数,最后使用 reset() 方法使输入流重新定位到标记的位置,继而完成重复读取操作。

输出流

在Java中所有的输出流都是OutputStream抽象类(字节输出流)和Writer抽象类(字符输出流)的子类。其中OutputStream类是字节输出流的抽象类,是所有字节输出流的父类。

字符输出流的父类是 Writer

常用方法:

nt write (b):将指定字节的数据写入到输出流。

int write (byte[] b):将指定字节数组的内容写入输出流。

int write (byte[] b,int off,int len):将指定字节数组从 off 位置开始的 len 字芳的内容写入输出流。

close():关闭数据流,当完成对数据流的操作之后需要关闭数据流。

flush():刷新输出流,强行将缓冲区的内容写入输出流。

IS和OS常用方法

InputStream是所有字节输入流的父类,其定义了基础的读取方法,常用的方法如下:

       int read()           

读取一个字节,以int形式返回,该int值的"低八位"有效,若返回值为-1则表示EOF

  int read(byte[] d)

尝试最多读取给定数组的length个字节并存入该数组,返回值为实际读取到的字节量。

 OutputStream是所有字节输出流的父类,其定义了基础的写出方法,常用的方法如下:

      void write(int d)

写出一个字节,写的是给定的int的"低八位"

  void write(byte[] d)

将给定的字节数组中的所有字节全部写出

文件流

创建FOS对象(重写模式)

FileOutputStream是文件的字节输出流,我们使用该流可以以字节为单位将数据写入文件。

 构造方法:

       FileOutputStream(File file)

//创建一个向指定File对象表示的文件中写出数据的文件输出流。

 FileOutputStream(String filename)

//创建一个向具有指定名称的文件中写出数据的文件输出流。

FileInputStream是文件的字节输入流,我们使用该流可以以字节为单位从文件中读取数据。

FileInputStream有两个常用的构造方法:

FileInputStream(File file)

创建一个从指定File对象表示的文件中读取数据的文件输入流。

FileInputStream(String name)

创建用于读取给定的文件系统中的路径名name所指定的文件的文件输入流

read()和write(int d)方法

FileInputStream继承自InputStream,其提供了以字节为单位读取文件数据的方法read。

  int read()

从此输入流中读取一个数据字节,若返回-1则表示EOF(End Of File)

 FileOutputStream继承自OutputStream,其提供了以字节为单位向文件写数据的方法write。

  void write(int d)

将指定字节写入此文件输出流,这里只写给定的int值的"低八位"

read(byte[] d)和write(byte[] d)方法

FileInputStream也支持批量读取字节数据的方法:

      int read(byte[] b)

从此输入流中将最多b.length个字节的数据读入到字节数组b中

FileOutputStream也支持批量写出字节数据的方法:

 void write(byte[] b)

将b.length个字节从指定byte数组写入此文件输出流中。

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

将指定byte数组中从偏移量offset开始的len个字节写入此文件输出流。

缓冲流

使用缓冲输出流可以提高写出效率,但是这也存在着一个问题,就是写出数据缺乏即时性。有时我们需要在执行完某些写出操作后,就希望将这些数据即时写出,而非在缓冲区中保存直到缓冲区满后才写出。这时我们可以使用缓冲流的一个方法flush。

     void flush()

清空缓冲区,将缓冲区中的数据强制写出。

实例:

    public void b()throws Exception{//创建缓冲字节输入流FileInputStream f=new FileInputStream("OO.java");BufferedInputStream bff=new BufferedInputStream(f);int d=1;//缓冲读入,实际上并非是一个字节一个字节从文件读取的。while((d=bff.read())!=-1) {System.out.println(d+"");}bff.close();}
}

对象流

对象序列化概念

· 对象是存在于内存中的。有时候我们需要将对象保存到硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作。这时我们需要将对象转换为一个字节序列,而这个过程就称为对象序列化。相反,我们有这样一个字节序列需要将其转换为对应的对象,这个过程就称为对象的反序列化。

使用OOS实现对象序列化

· ObjectOutputStream是用来对对象进行序列化的输出流。

· 其实现对象序列化的方法为:

void writeObject(Object o)

该方法可以将给定的对象转换为一个字节序列化后写出。

使用OIS实现对象反序列化

 · ObjectInputStream是用来对对象进行反序列化的输入流。

· 其实现对象反序列化的方法为:

        - Object readObject()

       该方法可以从流中读取字节并转换为对应的对象。  

 Serializable接口

    · ObjectOutputStream在对对象进行序列化时有个要求,就是需要序列化的对象所属的类必须实现Serializable接口。

· 实现该接口不需要重写任何方法。其只是作为可序列化的标志。

    ·  通常实现该接口的类需要提供一个常量serialVersionUID,表明该类的版本。若不显示的声明,在对象序列化时也会根据当前类的各个方面计算该类的默认serialVersionUID,但不同平台编译器实现有所不同,所以若想跨平台,都应显示的声明版本号。

Serializable接口(续1)

· 如果声明的类的对象序列化存到硬盘上面,之后随着需求的变化更改了类的属性(增加或减少或改名),那么当反序列化时,就会出现InvalidClassException,这样就会造成不兼容性的问题。

但当serialVersionUID相同时,它就会将不一样的field以type的预设值反序列化,可避开不兼容性问题。

transient关键字

 · 对象在序列化后得到的字节序列往往比较大,有时我们在对一个对象进行序列化时可以忽略某些不必要的属性,从而对序列化后得到的字节序列"瘦身"。

· 关键字transient

· 被该关键字修饰的属性在序列化时其值将被忽略。

转载于:https://www.cnblogs.com/wsnb8/p/11403628.html

Day02:基本IO操作相关推荐

  1. [零基础学JAVA]Java SE应用部分-27.Java IO操作(01)

    JAVA IO操作目标 本季知识点 1.File类 2.RandomAccessFile类 File类 在JAVA中所有的IO操作全部存放在java.io包中. File是唯一一个与文件本身有关的操作 ...

  2. java中的IO操作总结(一)

    转载:http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html    所谓IO,也就是Input与Output的缩写.在java中 ...

  3. python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame

    python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...

  4. CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占

    CPU被夺走的三种状态   .                           cpu的三种状态之              运行态      就绪态等待被调用             阻塞态 i ...

  5. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...

    IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...

  6. .NET中的IO操作基础介绍

    关于IO简介 .NET中的IO操作,经常需要调用一下几个类. 1.FileStream类        文件流类,负责大文件的拷贝,读写. 2.Path类                   Path ...

  7. 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)

    复制.移动.删除.比较.监控.文件读写 等文件和IO操作是编程中比较常用的功能. 幸运的是,Apache Commons IO等开源组件已经帮我们实现了.        我们可以不用重复造轮子了. 1 ...

  8. 对CPU的IO操作的理解

    什么是io操作 读写cpu寄存器,cache之外的设备叫做cpu的io操作,如内存,硬盘,网卡,但是读写内存很快,一般不将读写内存叫做io操作.

  9. C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作

    1. 多字节操作 一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组 操作 解释 is.get(sink, size, delim) 从is中读取最多 ...

最新文章

  1. POJ1022 Packing Unit 4D Cubes
  2. mysql中int时间和datetime时间的互相转换
  3. 大连理工版小学计算机教案,小学信息技术教案六年上LOGO 大连理工大学版.docx...
  4. ajax核心代码提交,ajax表单在Asp.net核心提交后的RedirectToAction
  5. underscore:get elements counts of a array
  6. maven 遇到failOnMissingWebXml有关问题解决方法
  7. HSRPSTPACL
  8. linux中mysql基本操作
  9. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入
  10. Insyde H2OFFT cannot load the driver 解决办法
  11. 圆形矢量场field driven strength效果
  12. 汽车行业如何玩转“Web3.0”?智己汽车“原石谷”开启区块链应用新场景!
  13. 金融贷款逾期的模型实现
  14. 计算机会议论文EI检索,ei检索会议论文算期刊_ei论文检索_ei会议论文算核心吗...
  15. Linux系统安装与使用基础之第二篇熟悉Linux操作系统
  16. Handheld Multi-Frame Super-Resolution论文理解
  17. 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践
  18. C# CAD操作之定位实体位置(视图操作缩放)
  19. mysql成绩表_mysql--学生课程成绩表
  20. 淘宝爬虫实战(附代码和数据集)——今天你脱发了吗?

热门文章

  1. 快速排序优化——三数取中法
  2. OMAP3630 I2C device驱动
  3. Simulink学习之Combinatorial Logic模块
  4. 使用pstack命令为空的原因与解决
  5. cron表达式入门_Sourcehunt:Cron管理,Hackathon入门,PHP-GUI…
  6. css3仿山猫侧边栏
  7. binutils工具集——ld的用法
  8. 毕业论文的研究背景怎么写?
  9. urllib3.exceptions.MaxRetryError问题的解决
  10. 3.1.hole_behind_comprehensive_teaching_complex 综教楼后的那个坑