如何在android中正确下载带有java代码的zip文件?

Dav*_*vid 2 zip android download

我尝试将一个zip文件下载到android,然后解压缩zip文件.我调试我的代码,有一个有趣的问题:下载的zip文件比原始文件大一点.并且下载的zip文件不能被winrar解压缩.据说下载的文件以错误结束.(我网站上的zip文件没问题.我尝试用IE下载.它运行正常.)以下是我的代码:

public void download(final String url, final String savePath, final String saveName) {
    new Thread(new Runnable() {
        public void run() {
            try {
                sendMessage(FILE_DOWNLOAD_CONNECT);
                URL sourceUrl = new URL(url);
                URLConnection conn = sourceUrl.openConnection();
                conn.connect();
                InputStream inputStream = conn.getInputStream();

                int fileSize = conn.getContentLength();

                File savefilepath = new File(savePath);
                if (!savefilepath.exists()) {
                    savefilepath.mkdirs();
                }
                File savefile = new File(savePath+saveName);
                if (savefile.exists()) {
                    savefile.delete();
                }
                savefile.createNewFile();

                FileOutputStream outputStream = new FileOutputStream(
                    savePath+saveName, true);

                byte[] buffer = new byte[1024];
                int readCount = 0;
                int readNum = 0;
                int prevPercent = 0;
                while (readCount < fileSize && readNum != -1) {
                    readNum = inputStream.read(buffer);
                    if (readNum > -1) {
                        outputStream.write(buffer);

                        readCount = readCount + readNum;

                        int percent = (int) (readCount * 100 / fileSize);
                        if (percent > prevPercent) {
                            sendMessage(FILE_DOWNLOAD_UPDATE, percent,
                                readCount);

                            prevPercent = percent;
                        }
                    }
                }
                outputStream.flush();
                outputStream.close();
                inputStream.close();
                //Thread.sleep(50);
                sendMessage(FILE_DOWNLOAD_COMPLETE, savePath);

            } catch (Exception e) {
                sendMessage(FILE_DOWNLOAD_ERROR, e);
            }
        }
    }).start();
}
Run Code Online (Sandbox Code Playgroud)

有人知道这个问题吗?

Ted*_*opp 5

当您读入缓冲区时,您将整个缓冲区写入输出流:

outputStream.write(buffer);
Run Code Online (Sandbox Code Playgroud)

您应该只编写已填充的缓冲区的一部分:

outputStream.write(buffer, 0, readNum);
Run Code Online (Sandbox Code Playgroud)

特别是对于网络下载,无法保证调用inputStream.read(buffer)将填充缓冲区(即使文件中有超过1024个字节).