`

源码剖析之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、另外三个方法是对是否可以设置回读而设计的(这是公认非常不好的设计方式,应该抽象为独立接口,而不是提供方法进行判断)
分享到:
评论

相关推荐

    INPUTSTREAM

    根据提供的文件名 `InputStream.java`,这可能是 `InputStream` 类的源代码文件。通过分析这个文件,我们可以学习到 `InputStream` 的具体实现,包括其内部方法的详细逻辑、异常处理策略以及如何通过覆写这些方法来...

    50丨装饰器模式:通过剖析JavaIO类库源码学习装饰器模式1

    在Java IO类库中,`InputStream`是所有输入流的抽象基类,提供了读取数据的基本操作。例如,`FileInputStream`是`InputStream`的一个具体实现,用于从文件中读取数据。然而,为了提高读取效率,Java提供了`...

    文件管理器FileManager - 安卓Android程序实例源代码.zip

    `java.io.InputStream`和`OutputStream`处理文件读写;`ContentResolver`与`Uri`结合,可用于访问多媒体文件和SQLite数据库文件。 4. **源代码结构分析** "文件管理器FileManager"实例通常包含以下组件: - `...

    Java宝典 光盘代码源文件

    《Java宝典》是一本深度剖析Java编程语言的权威指南,光盘中包含的源代码是作者为了辅助读者理解和实践书中理论知识而精心编写的。这些源文件是学习和掌握Java编程的重要参考资料,它们涵盖了从基础语法到高级特性的...

    58丨模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用1

    模板模式是一种行为设计模式,它在Java编程中...它在Java的多种场景中都有应用,包括IO流、Web服务和测试框架等,是理解和掌握设计模式的关键之一。通过熟练运用模板模式,开发者可以编写出更加灵活、易于维护的代码。

Global site tag (gtag.js) - Google Analytics