`
moor212
  • 浏览: 176091 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于java的InputStream.read(byte[] b,int off,int len)算法学习 .

 
阅读更多
基于java的InputStream.read(byte[] b,int off,int len)算法学习

public int read(byte[] b, int off, int len) throws IOException
将输入流中最多 len 个数据字节读入字节数组。尝试读取多达 len 字节,但可能读取较少数量。以整数形式返回实际读取的字节数。
在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。

如果 b 为 null,则抛出 NullPointerException。

如果 off 为负,或 len 为负,或 off+len 大于数组 b 的长度,则抛出 IndexOutOfBoundsException。

如果 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] 都不会受到影响。

如果不是因为流位于文件末尾而无法读取第一个字节,则抛出 IOException。特别是,如果输入流已关闭,则抛出 IOException。

类 InputStream 的 read(b, off, len) 方法只重复调用方法 read()。如果第一个这样的调用导致 IOException,则从对 read(b, off, len) 方法的调用中返回该异常。如果对 read() 的任何后续调用导致 IOException,则该异常会被捕获并将发生异常时的位置视为文件的末尾;到达该点时读取的字节存储在 b 中并返回发生异常之前读取的字节数。建议让子类提供此方法的更有效的实现。



参数:
b - 读入数据的缓冲区。
off - 在其处写入数据的数组 b 的初始偏移量。
len - 要读取的最大字节数。
返回:
读入缓冲区的总字节数,如果由于已到达流末尾而不再有数据,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
NullPointerException - 如果 b 为 null。


read是一个很好的读取器,对流,如应用于下载中是一个不错的算法!例子:
    public static final int INITIAL_SIZE = 100000;
    private byte buffer[] = new byte[INITIAL_SIZE];
    private int index = 0;

   private int capacity() {
        return (buffer.length - index);
    }

   public void read(InputStream in, int max) throws IOException {
        long k= 0;

        do {
            int size;

            // only read up to the max size, if the max size was
            // specified
            if (max != -1) {
                size = Math.min(capacity(), max);
            } else {
                size = capacity();
            }

            // actually read the block
            k= in.read(buffer, index, capacity());

            // quit if we hit EOF
            if (k< 0) {
                break;
            }

            // adjust capacity if needed
            index += k;

            if (capacity() < 10) {
                expand();
            }

            // see if we hit the max length
            if (max != -1) {
                max -= l;
                if (max <= 0) {
                    break;
                }
            }
        } while (k!= 0);
    }



分享到:
评论

相关推荐

    Java中InputStream类.pdf

    - `public int read(byte[] b, int off, int len) throws IOException`: 类似于上一个方法,但可以指定在数组`b`的哪个偏移量`off`开始存储,以及最多读取`len`个字节。 - `public void reset() throws IOException`...

    Java中的字节流.

    - `public void read(byte[] b, int off, int len) throws IOException`:从流中读取`len`个字节到数组`b`中,从索引`off`处开始存放。 - **其他常用方法**: - `public int available() throws IOException`:...

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

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

    JAVA语言中read方法分析

    3. **`read(byte[] b, int off, int len)`**:从输入流中读取最多`len`个字节,并将它们存储在指定的字节数组`b`中,从索引`off`开始。 这三个方法覆盖了不同场景下的数据读取需求。例如,当只需要读取单个字节时...

    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的InputStream类并借助其读取ppt文件

    3. `InputStream.read(byte[] b)`与`InputStream.read(byte[] b, int off, int len)`: 这两个方法用于读取多个字节。`read(byte[] b)`尝试读取`b.length`个字节到字节数组`b`中,但不保证一定能读取这么多,可能只...

    java字节流和字符流[借鉴].pdf

    3. 读取指定长度的字节数组:public int read(byte[] b, int off, int len) throws IOException 以下是一个简单的示例,演示如何使用 FileInputStream 从文件读取字节数据: ```java import java.io.File; import ...

    _Java数据流.ppt

    `read(byte[] b)` 方法读取多个字节并存储到提供的字节数组中,而 `read(byte[] b, int off, int len)` 允许指定读取的起始位置和长度。 相反,`OutputStream` 是字节输出流的基类,包含写入单个字节、写入字节数组...

    Java IO字符流和字节流

    - **`public int read(byte[] b, int off, int len)`**:从输入流读取最多len个字节到数组b中,从下标off开始。返回实际读取的字节数,如果流结束,返回-1。 - **`public void write(int b)`**:向输出流写入一个...

    Java基础学习28.pdf

    常见的方法包括read(),read(byte[] b),read(byte[] b, int off, int len)等。 3. 字符流的使用方法 - 字符输出流(Writer)用于将数据写入到输出设备中。常见的方法包括write(String), write(char[]), write(int...

    大学课程讲义-Java基础-IO

    * InputStream(典型实现:FileInputStream):int read()、int read(byte[] b)、int read(byte[] b, int off, int len) * Reader(典型实现:FileReader):int read()、int read(char[] c)、int read(char[] c, ...

    2018版 04747 Java语言程序设计(一)七八九十章知识点总结

    * int read( byte [ ] b ,int off , int len): 从输入流中读取长度为 len 的数据,从数组b 中下标为 off 的位置开始放置读入的数据,读毕返回读取的字节数。 * void close(): 关闭数据流 * int available(): 返回...

    Java字节流 .pdf

    * int read(byte[] b, int off, int len):将输入流中最多len个数据字节读入byte数组。 * void reset():将此流重新定位到最后一次对此输入流调用mark方法时的位置。 * long skip(long n):跳过和丢弃此输入流中数据...

    java线程下载网络文件源码

    - `write(byte[] b, int off, int len)`:将指定`byte`数组中的`len`字节从偏移量`off`开始写入此文件。 #### 5. `java.io.InputStream` & `java.io.OutputStream` - **用途**:基本的输入输出流接口。 - **方法**...

    浅谈Java的输入输出流

    - `int read(byte[] b, int off, int len)` - `OutputStream` 类也提供了类似的方法: - `void write(int b)` - `void write(byte[] b)` - `void write(byte[] b, int off, int len)` 2. **Reader** 和 **...

    Java输入数据流详解

    3. `read(byte[] b, int off, int len)`: 类似于`read(byte[] b)`,但允许指定读取的起始位置`off`和最大长度`len`。 4. `skip(long n)`: 跳过`n`个字节,返回实际跳过的字节数。可能会少于`n`,如果流中剩余的数据...

    2021-2022年收藏的精品资料软件工程师浅谈Java的输入输出流技术步骤说明.docx

    InputStream类提供了读取字节的基本方法,如read(),read(byte[] b)和read(byte[] b, int off, int len),而OutputStream类则提供了写入字节的方法,如write(int b),write(byte[] b)和write(byte[] b, int off, int...

    java解决压缩中文乱码

    public void write(byte[] b, int off, int len) throws IOException { super.write(b, off, len); } } public class UTF8ZipInputStream extends ZipInputStream { public UTF8ZipInputStream(InputStream in)...

    java数据流 I/O系统

    `read(byte[] b[])`和`read(byte[] b[], int off, int len)`则用于读取多个字节到数组中。此外,还有`close()`方法用于关闭流并释放资源,`available()`返回可读取的字节数,`skip(long l)`跳过指定字节数,以及`...

    Java Stream 全面讲解

    `int read(byte[] b, int off, int len)`:从指定的输入流中读取len个字节的数据到数组b中,从off位置开始存放,返回实际读取的字节数。 **示例代码**: ```java import java.io.FileInputStream; import java...

Global site tag (gtag.js) - Google Analytics