io系列之常用流二
一、对象的序列化、持久化。
将java的对象的基本数据类型和图形存入文件中,实现对象数据的序列化和持久化。
操作对象可以使用: ObjectOutPutStream 和 ObjectInPutStream ,
而被操作的对象: 必须实现 Serializable 接口(标记接口)
ObjectOutPutStream:
构造方法: ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。
一般方法:void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
该方法用于向文件中写入对象数据,与ObjectInputStream的 readObject方法配套使用。
另有其他存入各种数据的方法(与基本数据类型流同),和继承自OutputStream的方法,自行查阅文档。
ObjectInputStream:
构造方法: ObjectInputStream(InputStream in)创建读取指定 InputStream 的 objectInputStream。
一般方法: Object readObject() 从 ObjectInputStream 读取对象。
该方法用于从文件中读取对象数据,与ObjectOutputStream的 writeObject方法配套使用。
另有其他取出各种数据的方法(与基本数据类型流同),和继承自OutputStream的方法,自行查阅文档。
Serializable
一个标记接口,只有实现了该接口的类的对象才拥有被序列化,持久化的能力。该接口没有扩展功能。
实现了该接口的类,其中的静态成员也不能被序列化。
对于实现了该接口,其中有非静态,但是又不想被持久化的成员,我们可以使用 transient 关键字修饰它。
该接口通过类中的成员来计算一个标记值,成员有任何改动都会改变这个值,类和其对象都被该值标记,只有标记值相同的才能认为是对象属于该类。
我们可以使用在类中 (ANY-ACCESS-MODIFIER) static final long serialVersionUID = 42L; 来给成员修饰符固定一个标记值,此时成员的修饰符的
改变不再影响最终标记值的数值。使得我们对类的成员修饰符做了一定改动后,依然可以通过该类识别器原先固化的对象。
二、管道流。
输入输出可以相互连接的流。通常由一个线程的 PipedInputStream读取数据(从管道),之后由另一个流的 PipedOutputStream 输出数据(到管道),
如果两个流在同一个对象中存在,容易发生阻塞。
PipedInputStream
构造方法: PipedInputStream() 创建尚未连接的 PipedInputStream
PipedInputStream(PipedOutputStream pout)创建 PipedInputStream,使其连接到管道输出流 pout。
连接方法: void connect(PipedOutputStream src) 使此管道输入流连接到管道输出流 src。
其他方法: int available() 返回可以不受阻塞地从此输入流中读取的字节数 。
PipedOutputStream
构造方法: PipedOutputStream() 创建尚未连接的 PipedOutputStream
PipedOutputStream(PipedInputStream pin)创建PipedOutputStream,使其连接到管道输出流 pin。
连接方法: void connect(PipedInputStream pin) 使此管道输入流连接到管道输出流 in。
他们都是字节输入输出流的子类,其可以使用InputStream 和 OutputStream的共性方法。
三、RandomAccessFile类
该类可以根据构造函数传入的参数不同实现同时对文件进行读写功能,并能以字节的形式访问文件中的指定位置(类似于将文件看做一个大型的byte数组,
从第一个字节开始排列(一个汉子两个字节,字母一个字节,按照gbk排列))。
该类不是io体系中的成员,其内部已经封装了输入输出字节流,
构造函数: RandomAccessFile(File file, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定
参数 mode为 r表示只读, 为rw表示读写。
RandomAccessFile(String fileName, String mode)创建一个随机读取文件流,文件本身有fileName指定。
参数 mode为 r表示只读, 为rw表示读写。
当只传入r的时候,代表流对象为只读对象,此时传入的文件必须是存在的文件。否则会有异常。
当传入参数为rw时,代表流对象为读写对象,此时文件若存在则指向该文件,否则创建一个该文件(不会覆盖)
其他方法: 其基本read,write,close方法与FileInputStream和FileOutputStream相同。
int readInt() 从此文件读取一个有符号的 32 位整数。 (另有对应其他基本数据类型的相关方法)。
String readLine() 从此文件读取文本的下一行。
void writeInt(int v) 按四个字节将 int 写入该文件,先写高字节。(另有相对应的其他数据类型方法)。
int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。
long getFilePointer() 返回此文件中的当前偏移量。(即当前指针位置。)
void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
(此方法方便常用,重点掌握)。此方法配合写入方法,可以修改文件局部内容。
此方法配合读取方法可以获取文件局部内容。
四、基本数据类型流
专门进行基本数据类型操作的流。
DateOutputStream:
构造方法: DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流
特有方法: int size() 返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数
void writeInt(int v) 将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
存入一个int数据,类似方法还有对: short,float,double,boolean
dyte,char,long 等所有基本数据类型, 和String 的操作方法。
void writeUTF(String str) 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
使用该方法存入的数据必须使用 readUTF()方法读取。
注意:类ObjectOutputStream、 RandomAccessFile也具有上述除 size以外的所有功能。
DateInputStream:
构造方法:DateInputStream(InputStream in) 创建一个新的数据输入流,从指定基础输入流中读取数据。
特有方法:
int readInt() 读入一个int类型的值,就是读取四个字节。
读取一个int数据,类似方法还有对: short,float,double,boolean
dyte,char,long 等所有基本数据类型, 和String 的操作方法。
void readUTF() 以与机器无关方式使用 UTF-8 修改版编码从一个基础输入流中读取字符串。
该方法必须读取的是使用 writeUTF方法写入的数据。
注意: 类ObjectInputStream、 RandomAccessFile也具有上述全部功能。
注意: 使用读取类型的方法的顺序,必须与写入该文件的方法顺序相同,否则会读取失败。
五、ByteArrayStream
此类流的源和目的都是数组,没有涉及到系统底层资源, 该类没有close方法。
ByteArrayInputStream: 该流对象在建立的时候,需要接收一个数据源,该源是一个字节数组。
ByteArrayOutputStream: 该流对象在建立的时候,不需要指定数据目的,因为该对象内部封装了一个可变长度的byte数组。
特有方法: void reset() 将此 byte 数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出。
int size() 返回缓冲区的当前大小。
void writeTo(OutputStream out) 将此 byte 数组输出流的全部内容写入到指定的输出流参数中,
这与使用 out.write(buf, 0, count) 调用该输出流的 write 方法效果一样。(此方法涉及异常)
其他方法与基本字节流 基本相同。
另外: 有CharArrayReader和CharArrayWriter,
StringReader 和 StringWriter
都是相应的源和目的都是内存的输入输出流,方法功能大致与字节数组流相当。
io系列之常用流二的更多相关文章
- io系列之常用流一
一. 读取键盘录入和数据打印 在System类中, System.out: 对应的是标准输出设备(控制台)(一个PrintStream). System.in: 对应的是标准输入设备(键盘)(一个In ...
- io系列之字符流
java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,ja ...
- Java IO流(二)
目录 字节缓冲流 概述 BufferedOutputStream类 继承父类的共性成员方法 构造方法 BufferedInputStream类 继承自父类的方法: 构造方法 文件复制练习(增强版 使用 ...
- Java NIO系列教程(十二) Java NIO与IO
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- JAVA IO 字节流与字符流
文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节. ...
- java io系列01之 "目录"
java io 系列目录如下: 01. java io系列01之 "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...
- SpringMVC常用配置(二),最简洁的配置实现文件上传
Spring.SpringMVC持续介绍中,基础配置前面已经介绍了很多,如果小伙伴们还不熟悉可以参考这几篇文章: 1.Spring基础配置 2.Spring常用配置 3.Spring常用配置(二) 4 ...
- io系列之字节流
java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字节流. 一.字节流的File读写操作. Inpu ...
- Hexo系列(三) 常用命令详解
Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...
随机推荐
- wiki 安装
地址:https://www.jianshu.com/p/fb2574567eae
- hdu-6166(最短路+二进制分组)
题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...
- P1387 最大正方形 dp
思路: i j的最大正方形等于min(他的斜上方的的最大正方形,他的上方有的连续1,他的左方有的连续1)+1 #include<bits/stdc++.h> using namespac ...
- Linux CAT与ECHO命令详解
Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: 1.一次显示整个文件. $ cat filename 2.从 ...
- 【XSY2719】prime 莫比乌斯反演
题目描述 设\(f(i)\)为\(i\)的不同的质因子个数,求\(\sum_{i=1}^n2^{f(i)}\) \(n\leq{10}^{12}\) 题解 考虑\(2^{f(i)}\)的意义:有\(f ...
- 【BZOJ2333】【SCOI2011】棘手的操作 treap合并
题目大意 有\(n\)个节点,标号从1到\(n\),这\(n\)个节点一开始相互不连通.第\(i\)个节点的初始权值为\(a_i\),接下来有如下一些操作: \(U~x~y\):加一条边,连接第\(x ...
- springmvc返回xml格式、json格式数据
问:@ResponseBody注解怎么指定返回xml 还是json答:@RequestMapping 的produces 属性指定 produces = "application/xml&q ...
- synchronized 关键字解析
synchronized 关键字解析 同步锁依赖于对象,每个对象都有一个同步锁. 现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的 ...
- 洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)
洛谷题目传送门 顺便提一下题意有一个地方不太清楚,就是如果输出No还要输出最少需要添加多少张牌才能满足要求.蒟蒻考完以后发现四个点Too short on line 2... 比较需要技巧的搜索 既然 ...
- 【HDU1846】Brave Game(博弈论)
题面 HDU 题解 \(Bash\ Game\)模板题 #include<iostream> using namespace std; int T,n,m; int main() { io ...