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

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

最新文章

  1. 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记
  2. node cmd bash 相关命令
  3. swiper
  4. 自定义View之onMeasure()
  5. hdu 4277 2012长春赛区网络赛 dfs+hashmap ***
  6. C2第三次作业解题报告
  7. Ext.Form 自动填写表单内容
  8. Swordfish
  9. 动态绑定GridView数据源遇到问题
  10. ABP日志管理
  11. C# 开机自启动和最小化托盘显示
  12. 图像映射<map>、<area>
  13. js4
  14. solr 高亮springdatasolr
  15. Hystrix 详细说明
  16. JS实现年月日三级联动+省市区三级联动+国家省市三级联动
  17. Linux学习笔记:crontab定时任务
  18. Linux bash内置命令集
  19. 8,Phaser__并发且多阶段任务
  20. 【idea快捷键】

热门文章

  1. 配置SecureCRT以SSH公钥方式登录服务器
  2. DB2开发系列之四——触发器
  3. synchronized 原理分析
  4. C语言结构体作业
  5. 【Alpha版本】冲刺阶段 - Day4 - 加速
  6. 实验四:Android 开发基础
  7. ios中录音功能的实现AudioSession的使用
  8. tornado web高级开发项目
  9. 面试必问---HashMap原理分析
  10. github感悟