---恢复内容开始---

Java将IO(文件、网络、终端)封装成非常多的类,看似繁杂,其实每个类的具有独特的功能。

按照存取的对象是二进制还是文本,java使用字节流和字符流实现IO。

流是java对输入到输出之间的数据流通的抽象,一般都会和数据源或数据流向目标绑定。并且一个InputStream可以是另一个数据源或者数据流向,如:

  InputStream is = new BufferedInputStream(new FileInputStream(new File("hello.txt")));

BufferedInputStream是FileInputStream的输出 ,反之FileInputStream是BufferedInputStream的输入,他们都是InputStream。

所有的字节流类的基类是InputStream和OutputStream,使用字节流时,一般使用InputStream/OutputStream的对象引用指向特定的基类,其含义是流对象一旦创建,无需关注其源,只需对流进行读取操作。当然InputStream和OutputStream的一些子类具有独特的方法,无法通过InputStream和OutputStream的对象引用调用,则应该使用其本身。

所有的字符流类的基类是Reader和Writer,对Reader和Writer而言,直接使用其子类的对象引用,有如下好处:子类拥有独特的方法(如readLine()方法不会读取换行符 在只关注文本内容时好使),能更加明确的完成任务。对字符流来说,他关注的是文本,也就二进制编码之后的样式。

2、文件IO对象:

有如下几个类:File、FileInputStream、FileOutputStream以及随机读取文件的RandomAccessFile类;FileReader、FileWriter类。

前文说到,InputStream和OutputStream一般都不关注流本身的数据源(完成绑定之后),字节流的方法都是继承InputStream和OutputStream而又各自实现的,所有从抽象的概念上来讲,InputStream和OutputStream的子类只是完成了和源或者目标绑定(这么说好像不太准确,以后再改--其实具体当然还是子类在做)。

3、管道IO对象:

如PipedInputStream和PipedOutputStream。管道是java线程通信的一种方法,不能在多个进程(多个jvm间)通信。值得注意的是两个线程如果想要通信,那么拥有PipedOutputStream实例的一端在初始化OutputStream对象时需要将PipedOutputStream与PipedInputStream绑定。如:

  PipedOutputStream out = new PipedOutputStream(input);

或:

  out.connect(in);/in.connect(out);两个是一致的都是调用了PipedOutputStream的connect方法

3.1、管道IO如何实现线程通信

其实质使用的还是java线程对堆栈的共享,以实现在两个线程的读写。对PipedOutputStream、PipedInputStream而言,完成管道通信的前提是:写端和读端同时存在,并被不同的线程拥有(写和读都会造成阻塞)且线程存活。PipedOutputStream和PipedInputStream的绑定是在实例PipedOutputStream中拥有PipedInputStream的对象引用。PipedOutputStream和PipedInputStream拥有共同的缓冲区,缓冲区在PipedInputStream的实例中。该缓冲区不可扩展。Pipe IO使用closedByWriter和closedByWriter标识管道的开闭,使用out和in标识缓冲区数据的始和终(in是写的开始,也是数据的尾;out是读的开始,也就是数据的头),使用connected标识IO是否绑定。对写线程来说,向管道中写是调用PipedOutputStream中的sink对象引用的recivice方法向buffer写入数据。对读线程来说,读操作是调用PipedInputStream实例的read方法对buffer。read和recivce都是synchronized的。

4、序列化

4.1、序列化是指将对象的状态保存成可以存储或者传输的形式。反序列化是指将这种形式重新读取到各自对象中。

实现序列化的对象,必须要实现 java.io.Serializable 或 java.io.Externalizable 接口。java的基础数据类型和大部分类都实现了以上两个接口之一。同时,如果对象中实例变量中包含未实现 java.io.Serializable 或 java.io.Externalizable 接口的实例,该类也无法被序列化。

使用ObjectInputStream/ObjectOutputStream实现序列化/反序列化。将ObjectOutputStream和输出目标绑定,使用

// 构造函数
ObjectOutputStream(OutputStream output)
// public函数
void close()
void defaultWriteObject()
void flush()
ObjectOutputStream.PutField putFields()
void reset()
void useProtocolVersion(int version)
void write(int value)
void write(byte[] buffer, int offset, int length)
void writeBoolean(boolean value)
void writeByte(int value)
void writeBytes(String value)
void writeChar(int value)
void writeChars(String value)
void writeDouble(double value)
void writeFields()
void writeFloat(float value)
void writeInt(int value)
void writeLong(long value)
final void writeObject(Object object)
void writeShort(int value)
void writeUTF(String value)
void writeUnshared(Object object)

写入对象实现序列化。通过

int available()
void close()
void defaultReadObject()
int read(byte[] buffer, int offset, int length)
int read()
boolean readBoolean()
byte readByte()
char readChar()
double readDouble()
ObjectInputStream.GetField readFields()
float readFloat()
void readFully(byte[] dst)
void readFully(byte[] dst, int offset, int byteCount)
int readInt()
String readLine()
long readLong()
final Object readObject()
short readShort()
String readUTF()
Object readUnshared()
int readUnsignedByte()
int readUnsignedShort()
synchronized void registerValidation(ObjectInputValidation object, int priority)
int skipBytes(int length)

实现反序列化。

4.2、序列化的应用场景

4.3、序列化仅能支持保存/恢复对象的实例变量,不能保存对象的方法transient变量。同时,如果对象中实例变量中包含未实现 java.io.Serializable 或 java.io.Externalizable 接口的实例,该类也无法被序列化。如Thread、Socket。

Java知IO

Java知IO的更多相关文章

  1. Java知多少(66)输入输出(IO)和流的概述

    输入输出(I/O)是指程序与外部设备或其他计算机进行交互的操作.几乎所有的程序都具有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等.通过输入和输出操作可以从外界接收信息, ...

  2. Java知多少(完结篇)

    Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java ...

  3. Java知多少(105)套接字(Socket)

    网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...

  4. JAVA中IO技术:BIO、NIO、AIO

    1.同步异步.阻塞非阻塞概念        同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...

  5. JAVA的IO学习

    IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...

  6. Java的IO系统

     Java IO系统     "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务."     由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...

  7. Java知多少(8)类库及其组织结构

    Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个包中,随JDK一起发布,称为Java类库或Java API. API(Application Programming Interfac ...

  8. Java知多少(67)面向字符的输入流

    字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...

  9. Java知多少(68)面向字符的输出流

    面向字符的输出流都是类 Writer 的子类,其类层次结构如图 10-5 所示. 图10-5 Writer的类层次结构图 表 10-3 列出了 Writer 的主要子类及说明. 表 10-3 Writ ...

随机推荐

  1. Nginx 开启gzip 压缩,实现基于域名的虚拟主机。

    一:gzip(GNU-ZIP)是一种压缩技术. 经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多. gzip 的压缩页面需要浏览器和服务器双方都支持,实际上 ...

  2. Oracle服务器和客户端的安装和卸载

    Oracle 11g服务器与客户端的完全卸载方式与前些版本有了改变: 一.卸载前准备: 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 二.批处理卸载 ...

  3. Loadrunner初学

    1.创建脚本 启动Vvitrual User Generator 创建脚本 因为我们选择录制页面相关的操作,则选择web(HTTP/HTML) application type 选择是录制浏览器网页还 ...

  4. django中使用Model的update_or_create函数时报错

    官方使用示例: obj, created = Person.objects.update_or_create( first_name='John', last_name='Lennon', defau ...

  5. .Net的垃圾回收机制(GC)之拙见——托管类型的垃圾回收

    各种语言的垃圾回收在IT界噪的沸沸扬扬,有极大的优化同时也有瓶颈. 而在.Net中的垃圾回收机制又是怎样的呢? 众所知周,.Net中的垃圾回收机制是由.Net Framework托管的,带给开发者最大 ...

  6. 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)

    第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...

  7. 分享两个提高效率的AndroidStudio小技巧

    这次分享两个 Android Studio 的小技巧,能够有效提高效率和减少犯错,尤其是在团队协作开发中. Getter 模板修改--自动处理 null 判断 格式化代码自动整理方法位置--广度 or ...

  8. hibernate框架学习笔记3:API详解

    Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...

  9. C语言博客作业--一二维数组

    一.PTA实验作业 题目1(7-6) (1).本题PTA提交列表 (2)设计思路 //天数n:数组下标i:小时数h,分钟数m:对应书号的标签数组flag[1001] //总阅读时间sum初始化为0,借 ...

  10. Beta冲刺第四天

    一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:修复协作详情,日程详情日程类型显示纠正 2.黄腾达:修复管理者查看协作成员可以移除自己的问题,加入登录.注册表单按回车键就可直接完成操作的功能 3 ...