源码剖析之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[]数组里。[b]注意此方法调用了上一个抽象read方法[/b]。

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个字节。
[b]注意跳过字节其实通过读取来实现的,并且是循环读取,最大不超过SKIP_BUFFER_SIZE:2048[/b]

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、另外三个方法是对是否可以设置回读而设计的(这是公认非常不好的设计方式,[b]应该抽象为独立接口[/b],而不是提供方法进行判断)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值