Java I/O原理

基本概念:

·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技术:

·子缓冲区和数据共享:空间中的视图

·只读缓冲区

·内存映射文件:直接把文件映射到内存的数组中(危险)

·文件锁定:不想与别人共享文件,独占锁定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值