Java IO

根据Java 6的API

[size=large][b]字节流[/b][/size]

[b]InputStream[/b] 字节输入流 顶层抽象类

实现接口:
java.io.Closeable
方法:
abstract int read()方法,用来读流中的下一个字节。返回值是0到255,代表了这个字节的值。这是一个阻塞方法。等待输入数据准备好了,或者到文件未了,又或者是抛出异常。
int read(byte b[]): 一次性读入到一个数组b[],返回值是这次调用读入了多少个byte
int read(byte b[],int off, int len):比上面的方法对数组控制的更加精。
void close() : 关闭流。实现啥也没做,所以需要子类去实现。
int available(): 返回一个大概值代表还有多少个字节能从流中读出。实现啥也没做,需要子类去实现。
synchronized void mark(int readlimit) 和 synchronized void reset():这两个是同步方法,说明这两个方法间是互斥的。它们也是放在一起使用,主要是为了可以从流中重复的读出某一段内容。mark()用来记录当前在流中的位置,当接下来reset()调用的时候,就又从当时mark()的位置开始读数据。一般用的不多。也交由子类做具体实现。自身只给了个没什么用的实现。


[b]OutputStream[/b] 字节输出流 顶层抽象类

实现接口:
java.io.Closeable,java.io.Flushable
方法:
abstract void write(int b): 把这个传入的参数b写到输出流中。由于int类型是占四个字节(32bit)的,不过这里传入的b只用到它的低8位bit,高24将会被ingore,这就和InputStream中的read()对应起来了。
void write(byte b[]): 将 b[]这个字节数组里的东西写到输出流中。
void write(byte b[], int off, int len) : 比上面的方法精细一些的操控这个b[],可以将其指定的位置一部分写入输出流中。
void flush(): 没给实现
void close(): 没给实现

常用的一些子类及其方法:

[b]FileInputStream[/b]: 用来从文件里面读出东西
父类: InputStream
构造函数:常用的有
FileInputStream(String name)
FileInputStream(File file)
方法:
几个比较重要的方法都重写了且是用的是native方法,而没使用父类的实现。
native void open(String name): 打开一个文件,在构造函数中被调用。
native int read()
native int readBytes(byte b[], int off, int len)
native int available()
native void close0(): 被close方法调用
需要注意的是,这个类持有了两个引用,一个是FileDescriptor,一个是FileChannel

[b]FileOutputStream[/b]: 用来向文件里写东西,有一个append的类变量,表示这个写的操作是append还是replace,默认是replace
父类:OutputStream
构造函数:常用的有
FileOutputStream(String name)
FileOutputStreamFile(File file)
方法:
大多数也是native实现。
native void open(String name) :替换操作
native void openAppend(String name):增加操作
native void write(int b)
native void writeBytes(byte b[], int off, int len)
native void close0()
需要注意的是,这个类持有了两个引用,一个是FileDescriptor,一个是FileChannel。这个类没有自己实现flush()。

[b]ByteArrayInputStream[/b]: 这个类主要是从一个字节数组里面来读取数据,这个数组在构造的时候就给定了。
父类:InputStream
构造函数:
ByteArrayInputStream(byte buf[]): 传入的buf[]就是要被读的输入。
需要注意的是,这个类的读方法很多都是同步的,这也是满足当这块buf[]被多个线程访问时的情况。和类变量相关的操作都用了同步。这个类没有使用native方法。
方法:
synchronized int read()
synchronized int read(byte b[], int off, int len)
synchronized int available()


[b]ByteArrayOutputStream[/b]:这个类主要是把数据写到一个字节数组里面去,而且这个数组是“可增长”的(如果超出,程序会新建容量更大的数组,并把之前的内容copy过去)。
父类: OutputStream
构造函数:
public ByteArrayOutputStream(int size) : size代表是初始的时候构造个多大的数组
方法:
同样大多是同步方法
synchronized void write(int b);
synchronized void write(byte b[], int off, int len)
synchronized byte toByteArray()[]: copy这个被写入的字符数组到一个新字符数组
synchronized int size(): 当前这个被写入的字符数组的大小。
这个类也没实现flush();

[b]PipedInputStream[/b]: 管道输入流,通常和管道输入流一起,使得数据在线程之间通信。
一个线程使用PipedInputStream接收数据,一个线程使用PipedOutputStream写入数据。
通信是通过,一块内存中的字节数组(PipedInputStream的类变量)起缓冲作用,PipedInputStream从中读取数据。
由于这个缓冲字节数组是个类变量,可能被多个线程同时方法,故而对其操作的
方法基本都是同步的。
持有PipedOutputStream引用。
构造函数:
PipedInputStream(PipedOutputStream src) : 与对应的PipedOutputStream连接了。
PipedInputStream(): 此时还未与PipedOutputStream连接。
方法:
synchronized void receive(int b):将PipedOutputStream传来的字节b,放到缓冲字节数组中去。
synchronized void receive(byte b[], int off, int len):将一个字节字节数组的内容,放到自带的
缓冲字节数组中区。
synchronized int read():基本和父类方法的目的一致,就是从那个缓冲字节数组中取数据了。
synchronized int read(byte b[], int off, int len):类似父类方法。

[b]PipedOutputStream[/b]: 管道输出流。
持有PipedInputStream的引用
方法:
write(int b); 把b写入到输出流中。实际它直接调用了PipedInputStream的receive(b)方法。
write(byte b[], int off, int len):同样的,它其实就调用了PipedInputStream的receive(byte b[], int off, int len)方法。
synchronized void flush(): 做了这么一件事情:唤醒所有在等待该OutputStream持有的PipedOutputStream对象锁上的线程。


[b]FilterInputStream[/b]: InputStream的子类。 它基本上啥也没做。IO包有很多装饰者模式的实现。FilterInputStream主要还是给各个InputStream装饰类当一个父类的作用。
[b]FilterOutputStream[/b]: OutputStream的子类。它也是基本上啥也没做。同上

下面归纳几个常见的装饰者。复杂一些的自己查查API,看看有没有适合当前场景使用的。

[b]BufferedInputStream[/b]:缓冲输入流。其实它也是从内存的字节数组中读取数据,总的概念上其read等方法和ByteArrayInputStream上很像,不过它的实现上使用了更复杂的算法。没太仔细看,不过相信是提高了稳定性和性能。因为它是装饰者,它持有一个InputStream的引用。所以它用来装饰ByteArrayInputStream。

[b]BufferedOutputStream[/b]:缓冲输出流。总的概念上和ByteArrayOutputStream很像,不过他实现了flush()方法。
它可以用来装饰ByteArrayOutputStream。
方法:
flush(): 目的是调用它持有的输出流的out.write(buf, 0, count)方法,把缓冲的数据都写到流里。

[b]DataInputStream[/b]: 除了FilterInputStream,它还实现了java.io.DataInput这个接口,这个接口的主要目的就是把的字节转换成各种java的原生数据类型。所以,使用DataInputStream,它有多个不同的read方法可以得到不同数据类型的返回值。

[b]DataOutputStream[/b]:继承FilterOutputStream,实现了java.io.DataOutput接口,这个接口的目的是扩展了一组write方法,这组方法可以接受各种java的原生数据类型作为输入。


[size=large][b]字符流 [/b][/size]

[b]Reader[/b] 字符输入流 顶层抽象类
实现接口:java.lang.Readable , java.io.Closeable
它显示地使用一个Object类变量作为锁,而不是像字节流那样,直接用对象自身作为锁。
构造函数:
protected Reader():默认把自身当做锁
protected Reader(Object lock):传入一个锁对象
方法:
int read(java.nio.CharBuffer target): 将字符读入到 CharBuffer里面去,返回值是字符的数量。
int read() :读一个字符,返回值就是这个字符(以int的形式)。
abstract public int read(char cbuf[], int off, int len): 将字符读入到一个字符数组中,返回值是读入的字符数量。
其他的方法和字节流也比较类似。


[b]Writer[/b] 字符输出流 顶层抽象类
实现接口:java.lang.Appendable, java.io.Closeable,java.io.Flushable
加锁的机制和Reader类似。自带了一个char[]类变量,写入的数据都暂时放在这个char[]里面。
构造函数:
protected Writer()
protected Writer(Object lock)
方法:
write(int c):写一个字符到char[]类变量中。
abstract public void write(char cbuf[], int off, int len):将cbuf[]写入
write(String str, int off, int len) :将str写到char[]类变量中去
abstract public void flush()
abstract public void close()
Writer append(CharSequence csq) :将csq append到这个writer上,实际是调用了write(csq.toString());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值