`

BufferedInputStream如何缓冲IO以及InputStream中的read(byte[] b) 是否具有缓冲功能?

    博客分类:
  • java
 
阅读更多

装载:

http://blog.csdn.net/yeyinfei321/article/details/18451015

今天做IO练习的时候,突然意识到InputStream本身提供了3个read方法。其中有2个是将字节码读到一个byte数组中,那这个方法不是和BuffereInputStream一样提供了缓冲功能了么?

    翻了翻api,看了看源码,google了半天,只有这兄弟说得靠谱,转载了过来。原文地址:点击打开链接

从顶级的InputStream开始 

InputStream 定义了3个read方法。 

read();  
read(byte[]);  
read(byte[],int off,int len);  

 第二个read(byte[])其实就是read(b, 0, b.length) ,所以等同于第三个; 


第一个read()方法,api介绍如下: 

引用
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 
子类必须提供此方法的一个实现。



第三个read()方法,api介绍如下: 

引用
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。 
在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 

如果 len 为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用
的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。 

将读取的第一个字节存储在元素 b[off] 中,下一个存储在 b[off+1] 中,依次类推。读取的字节数最多等于 len。设 k 为实际读取的字节数;这些字节将存储在 b[off] 到 b[off+k-1] 的元素中,不影响 b[off+k] 到 b[off+len-1] 的元素。 

在任何情况下,b[0] 到 b[off] 的元素以及 b[off+len] 到 b[b.length-1] 的元素都不会受到影响。 

类 InputStream 的 read(b, off, len) 方法重复调用方法 read()。如果第一次这样的调用导致 IOException,则从对 read(b, off, len) 方法的调用中返回该异常。如果对 read() 的任何后续调用导致 IOException,则捕获该异常并将其视为到达文件末尾;到达该点时读取的字节存储在 b 中,并返回发生异常之前读取的字节数。在已读取输入数据 len 的请求数量、检测到文件结束标记、抛出异常前,此方法的默认实现将一直阻塞。建议子类提供此方法更为有效的实现。


关于三段红字的注解: 
第一段:InputStream是所有输入流的顶级类,当然只定义,不实现,具体的由子类去实现,如AudioInputStream, ByteArrayInputStream, FileInputStream等。 
第二段:指明了InputStream的read(byte[],int off,int len)的实现方式,就是简单的调用read()方法而已,而read()方法是一次只读取一个字节,依然每次都要调用底层系统,所以InputStream的read(byte[],int off,int len)性能和直接调用read()一样,byte[]缓冲区在这是摆设。 
第三段:正是由于第二段所说,才建议子类提供性能更好的方式来覆盖read(byte[],int off,int len)方法。 

那InputStream的子类有哪些呢?看下API就知道了,这几只拿FileInputStream来说. 
下面是FileInputStream的部分源码: 
 
  1. public native int read() throws IOException;  
  2.   
  3. private native int readBytes(byte b[], int off, int len) throws IOException;  
  4.   
  5. public int read(byte b[]) throws IOException {  
  6. return readBytes(b, 0, b.length);  
  7.    }  
  8.   
  9. public int read(byte b[], int off, int len) throws IOException {  
  10. return readBytes(b, off, len);  
分享到:
评论

相关推荐

    BufferedInputStream(缓冲输入流)详解_动力节点Java学院整理

    主要为大家详细介绍了BufferedInputStream缓冲输入流的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...

    BufferedInputStream 比 InputStream 性能点(实验数据报告)

    文本的保存(写入磁盘的时候),字节流 : BufferedInputStream 比 InputStream 性能会比较好点(本人测试过,有实验数据)

    java IO章节的总结

    IO从大的方向上分为字节流和字符流,包括四个抽象类: 1、输入:Reader, InputStream类型的子类(字符,字节) 2、输出:Writer, OutputStream类型的子类(字符,字节) 决定使用哪个类以及它的构造进程的一般...

    Java IO学习之缓冲输入流(BufferedInputStream)

    主要介绍了Java IO学习之缓冲输入流(BufferedInputStream)的相关资料,需要的朋友可以参考下

    BufferedInputStream 介绍_动力节点Java学院整理

    BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。...BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持“mark()标记”和“reset()重置方法”。

    day019-io笔记和代码.rar

    int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。 最常用 * //2. int read() 从输入流读取数据的下一个字节。 //3. int read(byte[] b, int off, int len) 从输入流...

    BufferedInputStream源码分析图

    BufferedInputStream源码分析图

    IO流之缓冲流

    字节输入缓冲 BufferedInputStream 字节输出缓冲 BufferedOutputStream 字符输入缓冲 BufferedReader 字符输出缓冲 BufferedWriter 【重点】 所有的缓冲流都没有任何的读取写入文件的能力,都需要对应的输入流和输出...

    java中实现复制文件和文件夹

    java中实现复制文件和文件夹 public static void copyFile(File sourceFile,File targetFile) throws IOException{ // 新建文件输入流并对它进行缓冲 FileInputStream input = new FileInputStream(sourceFile)...

    IO体系.java

    InputStream |--FileInputStream/:文件输入流。从文件系统中的某个文件中获得输入字节。用于读取图像,声音,视频等数据类的原始字节流。 | |--FilterInputStream/:包含一些输入流,将这些流用作其基本数据源,...

    JavaIO流精讲上

    File类概述、File类功能讲解、JAVA IO流概述、字节流、字符流、缓冲流、InputStream、OutputStream、Reader、Writer、FileInputStream、FileOutputStream、InputStreamReader、OutputStreamWriter、FileReader、...

    IO输入输出体系.rar

    io流简介 File类 createNewFile() File.pathSwparator 与系统有关的路径分隔符,它被表示为一个字符串 windows为 分号";" File.pathSwparatorChar 与系统有关的路径分割符,它被表示为一个字符 File.separator 与...

    java7源码-JavaIO:JavaIO

    java7 源码 JavaIO ##JavaIO基础面试题 1. 什么是IO 它是一种数据的流从源头到目的地。比如文件拷贝,输入流和...在处理小文件的时候,它们的性能还不错,在大文件是最好使用BufferedInputStream(或BufferedReader)和B

    缓冲流——字节缓冲流

    1. 缓冲流 1.1 缓冲流的作用 使用缓冲数组以后,整体的读取,写入效率提升很大!!! 降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。 字节输入缓冲 BufferedInputStream 字节输出缓冲 ...

    关于字节输入流的缓冲区的 api

    BufferedInputStream字节输入输出流的缓冲区的使用和规则

    java缓冲流、转换流、序列化流.docx

    缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。 字节缓冲流 构造方法 创建字节缓冲输入流: BufferedInputStream bis = new ...

    JDK_API_1_6

    BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 BufferedOutputStream 该类实现缓冲的输出流。 BufferedReader 从字符输入流中读取文本,...

    java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流

    目录java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流字节缓冲流 —BufferedInputStream&BufferedOutputStream字符缓冲流—BufferedReader&BufferedWriter转换流—InputStreamReader&...

    BufferedInputStream的用法1---马克-to-win java视频

    BufferedInputStream的用法1---马克-to-win java视频

Global site tag (gtag.js) - Google Analytics