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

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. 小细节,大用途,35 个 Java 代码性能优化总结!

    前言: 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用 ...

  2. 实现Windows程序的数据的绑定

    1.创建DataSet对象 语法: DataSet  数据集对象  =new  DataSet("数据集的名称字符串"); 语法中的参数是数据集的名称字符串,可以有,也可以没有.如 ...

  3. Python中的threadlocal

    在多线程中,对于共有的共享数据的操作,需要加锁. 但是,对于局部变量,则在每个线程之间相互独立. 假如线程T想要把函数F1中的局部变量V1传到函数F2中去,F2再想把这个变量传到F3中去,一层一层地传 ...

  4. 20162328蔡文琛week06

    学号 2016-2017-2 <程序设计与数据结构>第X周学习总结 教材学习内容总结 继承是从已有类派生出一个新类的过程. 继承的目的之一之复用已有的软件. 继承呢在子类和父类见建立了is ...

  5. PTA題目的處理(三)

    题目7-1 高速公路超速處罰 1.實驗代碼 #include <stdio.h> //#include <stdlib.h> int main() { int csp,lsp; ...

  6. CoreAnimation注意事项

    最近调查的一个bug和内存泄露都和CoreAnimation有关,因此谈一下使用CoreAnimation需要注意的几个问题 CAAnimation的delegate属性是retain的,这个设计确实 ...

  7. 201421123042 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承中的关键词:Soper,object,override,project, 1.2 尝试使用思维导图将这些关键词组织起来.注: ...

  8. 再议Python协程——从yield到asyncio

    协程,英文名Coroutine.前面介绍Python的多线程,以及用多线程实现并发(参见这篇文章[浅析Python多线程]),今天介绍的协程也是常用的并发手段.本篇主要内容包含:协程的基本概念.协程库 ...

  9. 一个诚实的孩纸选Python的原因

    我之所以会选择python语言程序设计这门课,是因为我一开始预选选的选修课都没选上,然后在补选的时候,在别人选剩的课里面选择了python. 上了两节课之后,我发现python还挺有意思的,挺喜欢py ...

  10. ArrayList源码学习----JDK1.7

    什么是ArrayList? ArrayList是存储一组数据的集合,底层也是基于数组的方式实现,实际上也是对数组元素的增删改查:它的主要特点是: 有序:(基于数组实现) 随机访问速度快:(进行随机访问 ...