来自互联网的文件已损坏

时间:2014-06-17 07:34:15

标签: java

我正在使用此代码从互联网上下载文件。

void download(String source, String destination, int size) {
    // ten percent of the total download size
    File ofile = new File(System.getProperty("user.dir") + "", destination);
    System.out.printf("\nDownloading\n\t%s\nTo\n\t%s\n", source, destination);
    try {
        if (ofile.exists()) ofile.delete();
        if (!ofile.createNewFile()) {
            throw new IOException("Can't create " + ofile.getAbsolutePath());
        }

        int inChar = 0;
        URL url = new URL(source);
        InputStream input = url.openStream();
        FileOutputStream fos = new FileOutputStream(ofile);
        for (int i = 0; i < size && inChar != -1; i++) {
            inChar = input.read();
            fos.write(inChar);
        }

        input.close();
        fos.close();
        System.out.println("Downloaded " + ofile.getAbsolutePath());
    } catch (EOFException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Main frame = new Main();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

然后我用另一段代码运行更新的程序:

public Main() {

    needDownload();
    if (needDownload){

    download("http://www.endcraft.net/webstart/privateers.jar", "privateers.jar",6550225);
    try {
        String exec = (System.getProperty("user.dir") + "\\privateers.jar");
        String[] command = {"javaw", "-jar", exec};  
        final Process process = Runtime.getRuntime().exec(command);
        System.out.println("Running " + exec);
        //System.exit(0);

    } catch (IOException e1) {
        e1.printStackTrace();
    }
    }
}

但是,下载的jar似乎已损坏。

"Error or invalid corrupt file /path/privateers.jar"

当我右键单击实际文件并点击“run with java”(程序之外)时,它也会抛出相同的错误。

但是,当我直接从我的FTP服务器而不是从我的应用程序下载它时,它可以正常工作并且不会以任何方式损坏。

我该如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

添加最后一行:

  final Process process = Runtime.getRuntime().exec(command);
    System.out.println("Running " + exec);
  process.waitFor();

强烈建议,如果使用jar是下一步要做的事情。下载可能需要几秒钟。

答案 1 :(得分:0)

尝试使用

File file = new File("FileName.jar"); 
FileOutputStream fileOut = new FileOutputStream(file);

并附加你的inChar并在for循环后立即写入:

for (int i = 0; i < size && inChar != -1; i++) {
          // append
        }
 fos.write(inChar);