站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题输入流问题!

输入流问题!

摘要: 输入流问题!


try{
src_image = http://location/temp/mapimage/img_1157433357280.gif
URL url = new URL(src_image);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
int length = connection.getContentLength();
System.out.println(url.toString());
FileOutputStream fos = new FileOutputStream(-#34;d://test.gif-#34;);
byte b[] = new byte[length];
while(true){
int i = is.read(b);
System.out.println(i);
if( i==-1 ) break;
fos.write(b);
}
fos.close();
}catch(Execption e){
}
现在的问题是有时候输出的图片是对的,有时候输出的图片下边就是一条条的乱码,我想问问什么原因,怎么解决。


你说的是输同一个图片有时候吗还是几个不同的图片,有可能是图片的问题哦!还有啊.你最好用一哈修辞流.或者用对象序列化.应该这样就行了!


一个图片,因为这个图片是个绝对路径的图片,所以直接写地址就行了,图片没有问题,在IE里可以直接访问到,那不用inputStream流,你说的哈西流和序列化怎么做?再包装一下?


int length = connection.getContentLength();
byte b[] = new byte[length];
while(true){
int i = is.read(b);
if( i==-1 ) break;
fos.write(b);
}

问题出在上面这几行代码。首先,没有必要根据 content length 开辟一个数组(如果图片文件很大的话,你岂不是很亏?),开一个固定大小的就可以了。其次,不应该等 read() 返回 -1 才结束,应该是读够了预期的字节数就结束,因为 -1 是要在对方关闭了 socket 时才会发生,你可能要为此多等待几秒钟(无谓的等待)。

但是上面这两点都不是导致图片混乱的原因。真正的原因在于,你应该用 fos.write(b, 0, i),这才是真正从 input stream 里读出来的数据,而不包含空白的缓冲区。


while(true){
int i = is.read(b);
System.out.println(i);
if( i==-1 ) break;
//fos.write(b,0,i);
}

for(int i=0;i-#60;b.length;i++){
fos.write(b[i]);
}
如果我不想在while里输出呢?该怎么写,这么写肯定是不行的。
给看看该怎么改造.


int length = connection.getContentLength();
byte[] b = new byte[length];
int ptr = 0;
while(ptr -#60; length){
int i = is.read(b, ptr, length-ptr);
if ( i == -1 ) break;
ptr += i;
}
fos.write(b);

不过我不明白,为什么你不想在 while 里输出呢?


因为我想把它放到库里,以后用的时候再拿出来,我做的是个中间程序,不是显示终端.当要显示的时候直接从库里拿出来,显示就行了,不用再去查图片了。查图片是另一个人做的,现在只能这么衔接了.估计以后会改吧.


再问个题外话,把这个byte[]数组放到blob字段里,再拿出来显示不会出问题吧.


↑返回目录
前一篇: 对象的比较
后一篇: 新手提问拉,希望大虾门给些指点。。。。。。。。。。。。。。。。。。。。。。。