`

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);  
分享到:
评论

相关推荐

    读取图片数据到byte[]数组,合并inputStream每次读取产生的缓冲byte[]

    在实际应用中,`InputStream`的多次读取可能涉及到`BufferedInputStream`的`read()`方法,它每次会读取一定大小的缓冲区。为了合并这些缓冲,我们需要维护一个`List<byte[]>`来存储每次读取的结果,然后在所有数据...

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

    Java IO中的BufferedInputStream是Java I/O流处理中非常重要的一部分,它属于过滤输入流(FilterInputStream)的一个子类。BufferedInputStream的主要目的是提高输入流的读取效率,通过内部维护一个缓冲区来批量处理...

    用JAVA实现缓冲多线程无阻塞读取远程文件.pdf

    - `java.io.InputStream.read(byte[] b, int off, int len)`: 读取数据到字节数组,返回读取的字节数。 - `java.io.InputStream.close()`: 关闭输入流并释放与流相关的系统资源。 2. 多线程编程 - `java.lang....

    使用缓冲流快速复制文件

    在实际应用中,我们还可以考虑添加异常处理机制,如检查文件是否存在、是否可读写,以及在复制过程中出现的任何其他错误。同时,可以考虑使用`Files.copy()`方法,这是Java 7引入的一个便捷方法,它可以直接复制文件...

    Java IO流 总结

    缓冲流是Java IO流中的一种优化机制,负责将数据缓存在内存中,以提高输入/输出性能。 a) 输入流:BufferedInputStream BufferedReader BufferedInputStream和BufferedReader是缓冲流的输入流,负责将数据缓存在...

    Java 中的 IO 流是如何实现的?

    Java中的`BufferedInputStream`和`BufferedOutputStream`就是提供了缓冲功能的字节流类。 2. **输入流(Input Stream)**: 输入流用于将数据从外部源(如文件、网络)读取到程序中。在Java中,字节输入流的基类是...

    JavaIO总结.pdf

    InputStream的API包括read()、read(byte[] b)和read(byte[] b, int off, int len)三个方法,用于从输入流读取数据。OutputStream的API包括write(int b)、write(byte[] b)和write(byte[] b, int off, int len)三个...

    java中的IO的基础教学(1)

    本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念 IO流是Java提供的一组接口和类,用于在不同数据源之间传输数据。数据源可以是文件、内存、网络连接等。...

    InputStream与OutputStream及File间互转

    这可以通过创建一个临时缓冲区实现,例如使用`BufferedInputStream`和`BufferedOutputStream`,或者使用`IOUtils`类(来自Apache Commons IO库): ```java // 使用Buffered streams BufferedInputStream in = ...

    Java教程之javaIO详解

    Java IO 中的 File 类、输入流和输出流是处理输入输出操作的基本类和方法,BufferedOutputStream、BufferedInputStream、DataOutputStream 和 DataInputStream 等过滤流提供了带缓冲的读写和基本数据类型的读写功能...

    java的IO流实现文件复制20190726.zip

    Java的IO流是Java平台中处理输入/输出操作的核心组件,它允许程序与各种数据源(如文件、网络连接、内存缓冲区等)进行交互。在这个案例中,我们讨论的主题是如何利用Java的IO流实现文件复制,特别是使用字节流进行...

    javaIO流知识大总结

    在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...

    java io流学习笔记1

    在实际应用中,我们通常会结合使用缓冲流(BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter)以提高读写性能。 在Java IO中,还有转换流(InputStreamReader和OutputStreamWriter)的...

    Java_IO流详解

    例如,结合使用`FileInputStream`和`BufferedInputStream`可以获得一个具有缓冲功能的文件输入流。 #### 二、Java IO流分类 Java的IO体系主要分为两大类:面向字节的流(Byte Streams)和面向字符的流(Character ...

    字节流字符流练习

    NIO中的通道(Channel)和缓冲区(Buffer)概念,以及选择器(Selector)的使用,为IO操作提供了更多的灵活性和性能提升。 通过本练习文档,你将有机会亲手实践这些IO流的使用,包括创建、读写文件,以及流的连接和...

    【Java基础笔记】IO流笔记.docx

    * read(byte[]):将数据读入byte数组中 3. OutputStream抽象类: * write(int):写入一个字节的数据 * write(byte[]):将byte数组的数据写入文件 4. Reader抽象类: * read():读取一个字符 * read(char[]):将...

    基于Java的二进制IO类与文件复制操作实例.zip

    在这个实例中,我们将深入探讨Java的二进制IO类以及如何使用它们进行文件复制操作。 一、二进制IO类 Java的`java.io`包提供了多个类来处理二进制数据。主要包括以下几类: 1. `InputStream`和`OutputStream`:这...

    Java IO 性能优化

    为了不将缓冲行为硬编码到每个单独的流类型中,专门的`BufferedInputStream`和`BufferedOutputStream`类被用来实现缓冲功能。这一点与C语言不同,在C语言中,基本的标准输入输出操作默认就是带缓冲的。 为了更好地...

    IO各种操作文件,字符流、字节流等

    Java IO 是Java平台中用于处理输入/输出操作的重要部分,它提供了一系列的类和接口,使得我们可以方便地读写文件、网络数据以及设备输入。在Java IO中,主要有两种流的概念:字符流(Character Stream)和字节流...

    java io一些探讨

    Java IO 中广泛使用了装饰模式来增强基础流的功能,例如`BufferedInputStream`、`DataInputStream`等都是基于`InputStream`的装饰者。 #### 五、文件锁 Java IO 支持文件锁定机制,通过`FileLock`类可以防止多个...

Global site tag (gtag.js) - Google Analytics