基本概念:
·I/O(Input/Output):一切的输入输出
·数据源(Data Source)
·数据宿(Data Sink):数据目的地
·Java中把不同的数据源与程序间的数据传输都抽象表述为“流”(Stream),java.io包中定义了多种I/O流类型实现数据I/O功能。
·I/O流分类:
流动方向:输入流(Input Stream)和输出流(Output Stream)
关联情况:节点流(Node Stream)和处理流(Processing Stream)
传输数据的颗粒大小:字符流(Character Stream)和字节流(Byte Stream)
·输入流只能从中读取数据,而不能向其写出数据;
·输出流则只能向其写出数据,而不能从中读取数据;
·特例:java.io.RandomAccessFile类是可读可写的。
·节点流直接连接到数据源;可以直接读或者写
·处理流是对一个已存在的流的连接和封装,通过对所封装的流的功能调用实现增强的数据读写功能,处理流并不直接连接到数据源。
·字节流以字节为单位进行数据传输,每次传送一个或多个字节;
·字符流以字符为单位进行数据传输,每次传送一个或多个字符;
·Java命名惯例:
凡是以InputStream或OutputStream结尾的类型均为字节流,凡是以Reader或Writer结尾的均为字符流。
基础I/O流类型:
·InputStream:
java.io.InputStream是所有字节输入流类型的父类,其中定义了以字节为单位读取数据的基本方法,并在其子类中进行了分化和实现。
·三个基本的read方法:
int read()
int read(byte[] buffer)
int read(byte[] buffer,int offset, int length)//读取
·其他方法:
void close()
int available() //返回后面还有多少字节可以访问
skip(long n) //丢弃当前输入流的n个字节
boolean markSupported() //判断是否支持可标记
void mark(int readlimit) //做标记
void reset() //跳转到标记
·OutputStream:
java.io.OutputStream是所有字节输出流类型的抽象父类。
三个基本的write方法:
void write(int c) //将参数c指定的位置写出
void write(byte[] buffer) //依次写出
void write(byte[] buffer,int offset, int length) //写length个字节写出到输出流中去
其他方法:
void close()
void flush() //清空缓冲区
·Reader:
java.io.Reader抽象类是所有字符输入流类型的父类,其中声明了用于读取字符流的有关方法。
三个基本的read()方法:
int read() //读取当前对象所关联的输入流的
int read(char[] cbuf) //每次从关联数据源中读取到cbuf中
int read(char[] cbuf,int offset,int length) //实际读取的长度返回到int
其他方法:
void close()
boolean ready() //判断当期输入流类型是否准备就绪
skip(long n) //跳过当前位置后的
boolean markSupported()
void mark(int readAheadLimit)
void reset()
·Writer:
java.io.Writer是所有字符输出流类型的共同父类。
·五个基本的write方法:
void write(int c)
void write(char[] cbuf)
void write(char[] cbuf,int offset,int length) //offset开始的
void write(String string)
void write(String string,int offset,int length)
其他方法:
void close()
void flush()
·常用I/O流类型:
FileInputStream / FileOutputStream:
·FileInputStream用于读取本地文件中字节数据,FileOutputStream用于将字节数据写出到文件。
FileReader/FileWriter
·FileReader用于以字符为单位读取文本文件,FileWriter类用于将字符数据写出到文本文件中。
BufferedReader/BufferedWriter
·BufferedReader用于缓冲读取字符,BufferedWriter则提供字符的缓冲写出功能。
错误日志的编写:可以利用标准输出的重定向来实现自动写入错误日志。
属性信息的保存:可以利用导出系统属性和导入系统属性来实现。
·对象序列化:
写出对象的状态信息,并遍历该对象对其他对象的引用,递归的序列化所有被引用到的其他对象,从而建立一个完整的序列化流。
·对象的持久性(Object Persistance):长久保存一个对象的状态并在需要时获取该对象的信息,以重新构造一个状态完全相同的对象。
·对象序列化(Object Serizalization):通过写出对象的状态数据来记录一个对象。
·要实现对象序列化必须实现以下两种接口之一:
java.io.Serializable
java.io.Externalizable
·java.io.ObjectOutputStream/ObjectInputStream类分别提供了对象的序列化和反序列化功能。以对象的方式进行传输和存储。
·对象序列化过程中的数据保护:在对象序列化过程中,其所属类的static属性和方法代码不会被序列化处理。
对于个别不希望被序列化的非static属性,可以在属性声明时使用transient关键字进行标明。
private tansient int name;
NIO:
new IO机制,出现在1.4版本以后,以块的形式来传输数据。
NIO能够对数据进行打包传输。
NIO基础:
·缓冲区(Buffer):所有数据都必须通过缓冲区,缓冲区满后再作为块传输;
·通道(Channel):可以实现数据的读入和写出操作,双向的。很底层。要通过缓冲区才能读取和写入,不能直接写入读出。
·字符集转换(Charset):不同字符集的转换,以Unicode为主要桥梁。
高级NIO技术:
·子缓冲区和数据共享:空间中的视图
·只读缓冲区
·内存映射文件:直接把文件映射到内存的数组中(危险)
·文件锁定:不想与别人共享文件,独占锁定。