搬家后的博客链接: IT客栈 www.itkezhan.org
我以前使用io的时候 例如 fileinputstream的时候一直都是 先获取这个文件的大小filesize 然后设置一个 (目前执行的位置start) ( 每次读取的大小 block) 然后设置一个缓冲区 这个缓冲区的大小为block 即每次读取的
数据是block 即 读一次 start += block 然后 在while 循环里面设置了判断 if(start + block > = filesize) 如果条件满足就退出读写。
但是这样做是会出错了。 当我需要用到网络下载的时候发现 由于网络延时的问题 ,对方计算机传过来的数据不一定就是你自己设置每次要读取的大小。
例如我设置了每次读 1024B 但是有时候对方传过来的数据只有 500B 所以这时候 我们还是向本地文件中写入了 1024 的数据(500B + 后面没有读取到数据块(可能是随机数,暂时没了解)) 所以就到了本地文件的出错。
废话不多说 上源码
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
class just
{
public void init(String s,String filename)
{
try
{
int hasRead = 0;
int start = 0;
final int block = 1024;
int filesize;
byte[] buff = new byte[1024];
URL url = new URL(s);
URLConnection con = url.openConnection();
filesize = con.getContentLength();
InputStream is = url.openStream();
FileOutputStream fos = new FileOutputStream(filename);
System.out.println(filesize);
while(start + block <= filesize)
{
hasRead = is.read(buff);
System.out.print("这次实际上只读取了:" + hasRead + " ");
System.out.println("但是程序还是写入 1024 所以下载下来就错误了");
fos.write(buff);
start += block;
}
is.read(buff);
fos.write(buff,0,(filesize%1024));
start += (filesize - start);
System.out.println("所以我们判断文件是否下载完的依据应该是 read() 方法是否传回来的数值为 -1");
if(is != null)
{
is.close();
}
if(fos != null)
{
fos.close();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public class test
{
public static void main(String[] args)
{
new just().init("http://img02.taobaocdn.com/imgextra/i2/758386792/T2t69zXXlcXXXXXXXX_!!758386792.jpg","image.png");
}
}