Day02:基本IO操作
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操作相关推荐
- [零基础学JAVA]Java SE应用部分-27.Java IO操作(01)
JAVA IO操作目标 本季知识点 1.File类 2.RandomAccessFile类 File类 在JAVA中所有的IO操作全部存放在java.io包中. File是唯一一个与文件本身有关的操作 ...
- java中的IO操作总结(一)
转载:http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html 所谓IO,也就是Input与Output的缩写.在java中 ...
- python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame
python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...
- CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
CPU被夺走的三种状态 . cpu的三种状态之 运行态 就绪态等待被调用 阻塞态 i ...
- python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...
IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...
- .NET中的IO操作基础介绍
关于IO简介 .NET中的IO操作,经常需要调用一下几个类. 1.FileStream类 文件流类,负责大文件的拷贝,读写. 2.Path类 Path ...
- 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)
复制.移动.删除.比较.监控.文件读写 等文件和IO操作是编程中比较常用的功能. 幸运的是,Apache Commons IO等开源组件已经帮我们实现了. 我们可以不用重复造轮子了. 1 ...
- 对CPU的IO操作的理解
什么是io操作 读写cpu寄存器,cache之外的设备叫做cpu的io操作,如内存,硬盘,网卡,但是读写内存很快,一般不将读写内存叫做io操作.
- C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作
1. 多字节操作 一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组 操作 解释 is.get(sink, size, delim) 从is中读取最多 ...
最新文章
- POJ1022 Packing Unit 4D Cubes
- mysql中int时间和datetime时间的互相转换
- 大连理工版小学计算机教案,小学信息技术教案六年上LOGO 大连理工大学版.docx...
- ajax核心代码提交,ajax表单在Asp.net核心提交后的RedirectToAction
- underscore:get elements counts of a array
- maven 遇到failOnMissingWebXml有关问题解决方法
- HSRPSTPACL
- linux中mysql基本操作
- 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入
- Insyde H2OFFT cannot load the driver 解决办法
- 圆形矢量场field driven strength效果
- 汽车行业如何玩转“Web3.0”?智己汽车“原石谷”开启区块链应用新场景!
- 金融贷款逾期的模型实现
- 计算机会议论文EI检索,ei检索会议论文算期刊_ei论文检索_ei会议论文算核心吗...
- Linux系统安装与使用基础之第二篇熟悉Linux操作系统
- Handheld Multi-Frame Super-Resolution论文理解
- 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践
- C# CAD操作之定位实体位置(视图操作缩放)
- mysql成绩表_mysql--学生课程成绩表
- 淘宝爬虫实战(附代码和数据集)——今天你脱发了吗?
热门文章
- 快速排序优化——三数取中法
- OMAP3630 I2C device驱动
- Simulink学习之Combinatorial Logic模块
- 使用pstack命令为空的原因与解决
- cron表达式入门_Sourcehunt:Cron管理,Hackathon入门,PHP-GUI…
- css3仿山猫侧边栏
- binutils工具集——ld的用法
- 毕业论文的研究背景怎么写?
- urllib3.exceptions.MaxRetryError问题的解决
- 3.1.hole_behind_comprehensive_teaching_complex 综教楼后的那个坑