看的是Core Java
1. Streams通常是文件,但也可能是网络连接,甚至是内存中的一块。
2. 读写字节
InputStream的方法
abstract int read()
读取一个byte并返回,如果到了输入源的结尾就返回-1
InputStream类也有几个非抽象的方法用于读取若干个字节或是跳过若干个字节,但都需要调用read()方法,而子类继承InputStream后也仅需要覆盖read()方法即可。(注意此时继承下来的读取若干字节的方法调用了子类的read()方法)
类似的OutputStream类的方法
abstract void write(int b)
read和write方法都可以暂停某个线程,直到字节读写完成后再继续。这就意味着如果无法及时从网络上读取信息的话,Java会使得这次调用挂起吗,此时就可以让其他的线程工作了。
available方法可以获得当前可读取的字节数,从而防止挂起:
int bytesAvailable = in.available();
if (bytesAvailable < 0)
{
byte[] data = new byte[bytesAvailable];
in.read(data);
}
对stream结束访问后,使用close方法清理空间,以防系统资源耗竭。close方法同时也清洗了输出流的缓冲区,如果没有close,最后写入的内容可能就无法送达了,不过也可以使用flush方法清洗缓冲区。
3. API
java.io.InputStream 1.0
abstract int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
off参数为读取的第一个字节写入b数组的位置
long skip(long n)
返回实际跳过的字节数
int available()
void close()
void mark(int readlimit)
在当前位置做标记,如果读取量超过了readlimit,就取消标记。并不是所有stream都支持mark
void reset()
回到上一个标记处。
boolean markSupported()
java.io.OutputStream 1.0
abstract void write(int n)
void write(byte[] b)
void write(byte[] b, int off, int len)
void close()
void flush()