源码剖析之java.io.InputStream

java io 是java操作数据源非常重要的一块。

java io的分类。
1、从源头来分:输入流和输出流
2、从操纵的内容上来看可分为:字符流(内容是文本)和字节流(内容是整体的)

高层抽象类:

字节输入流 --->java.io.InputStream
字节输出流--->java.io.OutputStream

字符输入流--->java.io.Reader
字符输出流--->java.io.Writer


java.io.InputStream 的方法分析如下:
1、    public abstract int read() throws IOException;
   读取一个字节,此方法返回的int 在0-255直接。

2、把inputStream里数据读到b的byte[]数组里。 注意此方法调用了上一个抽象read方法
public int read(byte b[], int off, int len) throws IOException {
	if (b == null) {
	    throw new NullPointerException();
	} else if (off < 0 || len < 0 || len > b.length - off) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return 0;
	}

	int c = read();
	if (c == -1) {
	    return -1;
	}
	b[off] = (byte)c;

	int i = 1;
	try {
	    for (; i < len ; i++) {
		c = read();//循环读取,效率很低,所有 一般要从写此方法
		if (c == -1) { 
		    break;
		}
		b[off + i] = (byte)c;
	    }	} catch (IOException ee) {
	}
	return i;
    }


3、public void close() throws IOException {}
  关闭输入流。
4、public int available() throws IOException
还剩下多少字节可以读取。

5、跳过n个字节。
      注意跳过字节其实通过读取来实现的,并且是循环读取,最大不超过SKIP_BUFFER_SIZE:2048
public long skip(long n) throws IOException {

	long remaining = n;
	int nr;
	if (skipBuffer == null)
	    skipBuffer = new byte[SKIP_BUFFER_SIZE];

	byte[] localSkipBuffer = skipBuffer;
		
	if (n <= 0) {
	    return 0;
	}

	while (remaining > 0) {
	    nr = read(localSkipBuffer, 0,
		      (int) Math.min(SKIP_BUFFER_SIZE, remaining));
	    if (nr < 0) {
		break;
	    }
	    remaining -= nr;
	}
	
	return n - remaining;
    }

6、另外三个方法是对是否可以设置回读而设计的(这是公认非常不好的设计方式, 应该抽象为独立接口,而不是提供方法进行判断)

你可能感兴趣的:(java io、java 流)