[重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别
Read 读入方法
- ### read():
一般是这种形式
public int read()
1.从流数据中读取的是一个一个字节(byte)
2.返回的是字节的(0-255)内的字节值
3.连续读取 读入一个就移动游标到下一个位置继续读取 读取到结尾返回-1 表示结束
4.如果不支持标记 则不可重复读
一般用于连续读取
代码示例
BufferedInputStream bis=……
int i=0;
while((i=bis.read())!=-1)
{
//处理……
}
- ### read(byte[] bytes)
一般是这种形式
public int read(byte b[])
1.从读取流读取指定长度的字节,如果比如文件总共是102个字节
2.我们定义的数组长度是10,那么默认前面10次都是读取10个长度
最后一次不够十个,那么读取的是2个,剩余部分是填充的 ‘0’
3.这十一次读取,每次都是放入10个长度的数组.
一般用于带缓冲读取 可以加快读取速度
代码示例
BufferedInputStream bis=……
byte[] bytes=new byte[4096];
int i=0;
while((i=bis.read(bytes))!=-1)
{
//处理……
}
- ### read(byte[] bytes,int off ,int len)
一般是这种形式
public int read(byte b[], int off, int len)
1.从读取流读取一定数量的字节,如果比如文件总共是102个字节
2.我们定义的数组长度是10,但是这里我们写read(bytes,0,9)那么每次往里面添加的(将只会是9个长度),就要读12次,最后一次放入3个.
3.所以一般读取流都不用这个而是用上一个方法:read(byte[]);
Write 写出方法
- ### write(int i);
public void write(int b)
直接往流写入字节形式的(0-255)int值.
- ### write(byte[] bytes);
public void write(byte b[])
往流里边写入缓冲字节数组中的所有内容, 数组有效内容不足整个数组长度 剩余的填充值’0’ 也会别写入到输出流
所以一般写入不用此方法 而用下面那个方法 和Read刚好是反的
- ### write(byte[] bytes,int off,int len);
public void write(byte b[], int off, int len)
1.这个是更严谨的写法,在外部定义len,然后每次len都等于流往数组中存放的长度
2.如上述read(bytes),前面每次都放入十个,第十一次放入的是2个,如果用第二种write(bytes),将会写入输出流十一次,每次写入十个长度,造成后面有8个空的,比原来的内容多了
3.所以用write(byte[] bytes,int off,int len);就不会出现多出来的空的情况,因为最后一次len不同
示例
FileInputStream fileInputStream = ……;
byte[] buffer = new byte[buffersize];
int len = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, len);
}
总结
所以除非文件很小 可以直接使用直接读写
通常情况小都使用缓存式读写
- 完整代码示例
BufferedInputStream bis = ……
BufferedOutputStream bous=……
byte[] bytes = new byte[4096];
int len = 0;
while (-1 != (len = bis.read(bytes))) {
bous.write(bytes,0,len);
}