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

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. 【Python】 关于import和package结构

    关于import语句 python程序需要使用某个第三方模块的话要用import语句,其实就是把目标模块的内容加载到内存里.当然,在加载之前,python会按照一定的顺序寻找sys.path中的目录. ...

  2. mariadb插入中文数据乱码解决过程

    基本情况: 系统:centos 7 mariadb安装方式:yum 乱码解决过程: 查看当前数据库编码(登录数据库后) # show variables like 'character%'; (上图为 ...

  3. 打印十字图 JAVA 递归实现

    这个是我自己想的,头疼了一个下午,不过还好.做出来了.在网上找这道题但没有找到用递归的做法. /*递归思想实现 * 标题:打印十字图 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可 ...

  4. LeetCode-101.对称二叉树

    链接:https://leetcode-cn.com/problems/symmetric-tree/description/ 给定一个二叉树,检查它是否是它自己的镜像(即,围绕它的中心对称). 例如 ...

  5. (译文)掌握JavaScript基础--理解this关键字的新思路

    普通函数 下面这种就是普通函数 function add(x, y) { return x + y; } 每个普通函数被调用的时候,都相当于有一个this参数传进来. 内部函数this不会是外部函数传 ...

  6. C语言第六周博客作业--数据类型

    一.PTA实验作业 题目1: 7-6 掉入陷阱的数字 1. 本题PTA提交列表 2.设计思路 定义变量N,i,g=1表示位数,a表示各位数字相加的和,b=0,j,N1,c,d用于储存N do{ for ...

  7. 201621123057 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 答 ...

  8. node.js基础

    //安装淘宝npm镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org//require表示引包,引包就是引用自己的一个特 ...

  9. 使用 PuTTY 从 Windows 连接到 Linux 实例

    启动您的实例之后,您可以连接到该实例,然后像使用您面前的计算机一样来使用它. Note 启动实例后,需要几分钟准备好实例,以便您能连接到实例.检查您的实例是否通过了状态检查 - 您可以在 Instan ...

  10. map的infowindow的show事件(ArcGIS API for JS)