read(byte[] b) :
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到 b[b.length-1] 的元素。
举例说明一下:
/**
* User: liuwentao
* Time: 12-1-25 上午10:11
*/
public class InputStreamTest2 {
public static void main(String[] args){
String path = "D:\\project\\opensouce\\opensouce_demo\\base_java\\src\\demo\\java\\inputstream\\";
File file = new File(path + "xuzhimo.txt");
InputStream inputStream = null;
int i=0;
try {
inputStream = new FileInputStream(file);
byte[] bytes = new byte[16];
while ((i = inputStream.read(bytes))!=-1){
String str = new String(bytes);
System.out.print(str);
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
以下为read(byte buffer)方法的源代码:
此read(byte[] buffer) 方法调用下面的read(byte[] buffer, int offset, int length)方法
public int read(byte[] buffer) throws IOException {
return read(buffer, 0, buffer.length);
}
public int read(byte[] buffer, int offset, int length) throws IOException {
Arrays.checkOffsetAndCount(buffer.length, offset, length);
//length的长度为buffer.length,也就是字节数组的长度
for (int i = 0; i < length; i++) {
int c;
//c==-1说明读到结尾了 方法return
try {
if ((c = read()) == -1) {
return i == 0 ? -1 : i;
}
} catch (IOException e) {
if (i != 0) {
return i;
}
throw e;
}
//不等于-1 就把这个c赋值给这个字节数组的的一个对应的索引,然后强制转换成char类型
//c是一个字符对应的assic码值
buffer[offset + i] = (byte) c;
}
return length;
}
这个是JAVA api里面的内部实现呀,就是他读文件的时候,先把文件流放到你传入的byte数组里面,byte数组是引用类型,他在往里面放东西,byte数组内容当然就改变了,至于返回什么类型,那就是方法随便定义的呀,他返回一个int类型起始就是告诉你文件有没有读取完毕啦,你再仔细看看API说明
其实,这个byte[]数组相当于工地上的搬运车,把一堆砖块从一个地方转移到另一个地方,用到这个车一次一次的搬运;每次给车装满才能往另一个地方搬运,如果车装满了,返回值为-1;
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
希望能解决您的问题。