黑马程序员技术交流社区
标题:
关于io流中的一些小问题
[打印本页]
作者:
陈晓东
时间:
2011-10-4 18:20
标题:
关于io流中的一些小问题
[code=java]File dir = new File("c:\\pic");
File file = new File(dir,ip+"("+(++count)+").jpg");
while(file.exists())
file = new File(dir,ip+"("+(++count)+").jpg");
InputStream in = s.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024*4];
int len = 0;
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
out.write("上传成功".getBytes());
fos.close();
s.close();[/code]以上是一个代码中的部分代码,我想请教的是 关于while((len=in.read(buf))!=-1)这部分 这个返回的len倒是是什么值,是不是存入到数组中有效数据的角标值?如果是角标值的话,那么为什么还要判断!=-1呢?如果没有数据的话就不往数组里面存了。是不是在底层调用的时候这样定义的?如果是的话,能不能把底层调用的原理给我讲一下了,谢谢。
作者:
匿名
时间:
2011-10-4 21:14
in.read()是InputStream类的一个方法,jdk说明文档对此方法的详解为:
从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。如果因已到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。
作者:
陈晓东
时间:
2011-10-4 21:53
3楼所说的是public int read()这个方法 而我所说的是public int read(byte[] b)这两个是不一样的
public int read()这个底层原理如下:[code=java]import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0;
private int len = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
public int myRead()throws IOException
{
if(len==0)
{
len = in.read(buf);//这个len就是读取到的有效数据的总长度。
if(len<0)
return -1;
pos=0;
byte b = buf[pos];
//System.out.println("b="+b);
pos++;
len--;
return b&0xff;//为了避免读取到的字节与-1的2进制一样,所以&255.
}
else if( len>0)
{
byte b = buf[pos];
pos++;
len--;
return b&255;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}[/code]所以read()这个方法的返回值在0到255的int 字节值
由write(byte[] b, int off, int len)(注释:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。)方法中可以看出len还是有效数据的长度。所以2楼给的解释很合理。谢谢了。还是要多看API啊。哎,本来一个很好理解的东西被我搞复杂了。
[
本帖最后由 陈晓东 于 2011-10-04 22:17 编辑
]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2