android 版本升级,从服务器下载的apk,包解析失败问题解决

来源:互联网 发布:网络教育是怎么回事 编辑:程序博客网 时间:2024/04/29 17:08

今天做了一个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





原创粉丝点击