今天做了一个android 的版本升级,从服务器上面下载下来的apk总是在安装的时候 报解析失败,包不能解析。
开始找问题,发现 下载下来的文件和实际服务器中的文件大小不一致。 这应该就是问题的根源了。
我以前的写文件的方法如下:
byte[] buffer=new byte[1024];
while(input.read(buffer)!=-1){
output.write(buffer);
}
我的理解:
这种读写方式 就会导致文件在最后生成的时候会有很多空字节,因为循环读1024个字节,在最后的时候1024未必会读满。
所以改进代码如下:
byte[] buffer=new byte[1024];
int l=0;
while((l=input.read(buffer))!=-1){
output.write(buffer,0,l);
}
int size=input.read(byte[]); 他返回的size就是以整数形式返回实际读取的字节数。 所以在write的时候 写入他的有效字节数就避免了此问题。
全部代码为:
public boolean download(String urlStr,String version){
//String urlStr="http://172.17.54.91:8080/download/1.mp3";
String path="file";
String fileName="demo_"+version+".apk";
OutputStream output=null;
try {
/*
* 通过URL取得HttpURLConnection
* 要网络连接成功,需在AndroidMainfest.xml中进行权限配置
* <uses-permission android:name="android.permission.INTERNET" />
*/
URL url=new URL(urlStr);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
//取得inputStream,并将流中的信息写入SDCard
/*
* 写前准备
* 1.在AndroidMainfest.xml中进行权限配置
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* 取得写入SDCard的权限
* 2.取得SDCard的路径: Environment.getExternalStorageDirectory()
* 3.检查要保存的文件上是否已经存在
* 4.不存在,新建文件夹,新建文件
* 5.将input流中的信息写入SDCard
* 6.关闭流
*/
String SDCard= Environment.getExternalStorageDirectory()+"";
String pathName=SDCard+"/"+path+"/"+fileName;//文件存储路径
//String pathName="F:\\"+"/"+path+"/"+fileName;//文件存储路径
File file=new File(pathName);
InputStream input=conn.getInputStream();
if(file.exists()){
System.out.println("exits");
file.delete();
}
String dir=SDCard+"/"+path;
new File(dir).mkdir();//新建文件夹
file.createNewFile();//新建文件
output=new FileOutputStream(file);
//读取大文件
byte[] buffer=new byte[1024];
int l=0;
while((l=input.read(buffer))!=-1){
output.write(buffer,0,l);
}
input.close();
output.close();
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
转载请标明原著:http://blog.csdn.net/qq_34155601/article/details/72651714