基于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);
}
分享到:
相关推荐
- `public int read(byte[] b, int off, int len) throws IOException`: 类似于上一个方法,但可以指定在数组`b`的哪个偏移量`off`开始存储,以及最多读取`len`个字节。 - `public void reset() throws IOException`...
- `public void read(byte[] b, int off, int len) throws IOException`:从流中读取`len`个字节到数组`b`中,从索引`off`处开始存放。 - **其他常用方法**: - `public int available() throws IOException`:...
- `java.io.InputStream.read(byte[] b, int off, int len)`: 读取数据到字节数组,返回读取的字节数。 - `java.io.InputStream.close()`: 关闭输入流并释放与流相关的系统资源。 2. 多线程编程 - `java.lang....
3. **`read(byte[] b, int off, int len)`**:从输入流中读取最多`len`个字节,并将它们存储在指定的字节数组`b`中,从索引`off`开始。 这三个方法覆盖了不同场景下的数据读取需求。例如,当只需要读取单个字节时...
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)三个...
3. `InputStream.read(byte[] b)`与`InputStream.read(byte[] b, int off, int len)`: 这两个方法用于读取多个字节。`read(byte[] b)`尝试读取`b.length`个字节到字节数组`b`中,但不保证一定能读取这么多,可能只...
3. 读取指定长度的字节数组:public int read(byte[] b, int off, int len) throws IOException 以下是一个简单的示例,演示如何使用 FileInputStream 从文件读取字节数据: ```java import java.io.File; import ...
`read(byte[] b)` 方法读取多个字节并存储到提供的字节数组中,而 `read(byte[] b, int off, int len)` 允许指定读取的起始位置和长度。 相反,`OutputStream` 是字节输出流的基类,包含写入单个字节、写入字节数组...
- **`public int read(byte[] b, int off, int len)`**:从输入流读取最多len个字节到数组b中,从下标off开始。返回实际读取的字节数,如果流结束,返回-1。 - **`public void write(int b)`**:向输出流写入一个...
常见的方法包括read(),read(byte[] b),read(byte[] b, int off, int len)等。 3. 字符流的使用方法 - 字符输出流(Writer)用于将数据写入到输出设备中。常见的方法包括write(String), write(char[]), write(int...
* 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, ...
* int read( byte [ ] b ,int off , int len): 从输入流中读取长度为 len 的数据,从数组b 中下标为 off 的位置开始放置读入的数据,读毕返回读取的字节数。 * void close(): 关闭数据流 * int available(): 返回...
* int read(byte[] b, int off, int len):将输入流中最多len个数据字节读入byte数组。 * void reset():将此流重新定位到最后一次对此输入流调用mark方法时的位置。 * long skip(long n):跳过和丢弃此输入流中数据...
- `write(byte[] b, int off, int len)`:将指定`byte`数组中的`len`字节从偏移量`off`开始写入此文件。 #### 5. `java.io.InputStream` & `java.io.OutputStream` - **用途**:基本的输入输出流接口。 - **方法**...
- `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** 和 **...
3. `read(byte[] b, int off, int len)`: 类似于`read(byte[] b)`,但允许指定读取的起始位置`off`和最大长度`len`。 4. `skip(long n)`: 跳过`n`个字节,返回实际跳过的字节数。可能会少于`n`,如果流中剩余的数据...
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...
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)...
`read(byte[] b[])`和`read(byte[] b[], int off, int len)`则用于读取多个字节到数组中。此外,还有`close()`方法用于关闭流并释放资源,`available()`返回可读取的字节数,`skip(long l)`跳过指定字节数,以及`...
`int read(byte[] b, int off, int len)`:从指定的输入流中读取len个字节的数据到数组b中,从off位置开始存放,返回实际读取的字节数。 **示例代码**: ```java import java.io.FileInputStream; import java...