Java知IO
---恢复内容开始---
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的更多相关文章
- Java知多少(66)输入输出(IO)和流的概述
输入输出(I/O)是指程序与外部设备或其他计算机进行交互的操作.几乎所有的程序都具有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等.通过输入和输出操作可以从外界接收信息, ...
- Java知多少(完结篇)
Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java ...
- Java知多少(105)套接字(Socket)
网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...
- JAVA中IO技术:BIO、NIO、AIO
1.同步异步.阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...
- JAVA的IO学习
IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...
- Java的IO系统
Java IO系统 "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务." 由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...
- Java知多少(8)类库及其组织结构
Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个包中,随JDK一起发布,称为Java类库或Java API. API(Application Programming Interfac ...
- Java知多少(67)面向字符的输入流
字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...
- Java知多少(68)面向字符的输出流
面向字符的输出流都是类 Writer 的子类,其类层次结构如图 10-5 所示. 图10-5 Writer的类层次结构图 表 10-3 列出了 Writer 的主要子类及说明. 表 10-3 Writ ...
随机推荐
- 【Python】 SQLAlchemy的初步使用
SQLAlchemy 在很多Python的web框架中都整合进了SQLAlchemy这个主要发挥ORM作用的模块.所谓ORM,就是把复杂的SQL语句给包装成更加面向对象,易于理解的样子.在操作数据库的 ...
- DB2开发系列之三——SQL函数
1.内置函数分类(SYSIBM模式内) 1)标量函数:返回一个标量值的函数: 2)聚合函数:也叫列函数,也返回一个标量值,这个值是一组输入值的计算结果:3)表函数:向引用它的 SQL 语句返回一个表: ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- 导入TensorFlow报错
C:\....\Anaconda3\envs\py35\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the ...
- Build to win--来自小黄衫
写在前面 首先非常荣幸.非常侥幸能以微弱的优势得到这次小黄衫,感谢各位老师同学的帮助,也谢谢来自<构建之法>团队的小黄衫赞助! 这次能够获得小黄衫,就像汪老师上课说的那样,其实,是一个积累 ...
- JAVA中最容易让人忽视的基础。
可能很多找编程工作的人在面试的时候都有这种感受,去到一个公司填写面试试题的时候,多数人往往死在比较基础的知识点上.不要奇怪,事实就是如此一般来说,大多数公司给出的基础题大概有122道,代码题19道左右 ...
- RESTful三问
我觉得学习一个技术,其实就是要弄明白三件事情:是什么(what),为什么(why),怎么用(how).正是所谓的三W方法. 所以打算总结一个"三问"系列.为了自己学习,也分享给别人 ...
- 第二篇:利用shell脚本执行webservice请求——基于soap
1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...
- css3动画 一行字鼠标触发 hover 从左到右颜色渐变
偶然的机会发现的这个东东 这几天做公司的官网 老板突然说出了一个外国网站 我就顺手搜了 并没有发现他说的高科技 但是一个东西深深地吸引了我 就是我下面要说的动画 这个好像不能放视频 我就简单的描述一 ...