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

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



    原文作者:来啊快活啊
    原文地址: https://blog.csdn.net/qq_34155601/article/details/72651714
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞