代码之家  ›  专栏  ›  技术社区  ›  nkr1pt

Java下载文件有时会导致CRC

  •  2
  • nkr1pt  · 技术社区  · 15 年前

    代码非常简单:

    is = urlConn.getInputStream();
    fos = new FileOutputStream(outputFile);
    
    eventBus.fireEvent(this, new DownloadStartedEvent(item));
    
    int read;
    byte[] buffer = new byte[2048];
    while ((read = is.read(buffer)) != -1) {
       fos.write(buffer, 0, read);
    }
    
    eventBus.fireEvent(this, new DownloadCompletedEvent(item));
    

    乍一看效果很好,下载文件没有任何问题, 有时在尝试提取一批下载的rar文件时,提取失败,其中一个rar部分出现CRC错误。

    由于这种情况已经发生过几次了,尽管不一致,我开始怀疑代码中的某些内容不正确/不理想。 知道使用JDK FixedThreadPool机制有4个下载同时执行会很有帮助:

    execService.execute(new Runnable() {
    
                    @Override
                    public void run() {
                        if (item.getState().equals(DownloadCandidateState.WAITING)) {
                            Downloader downloader = new Downloader(eventBus);
                            downloader.download(item, item.getName());
                        }
                    }
    });
    

    如果这个偶然的CRC错误与代码有关,或者与其他事情有关,你有什么想法吗?

    更新

    我还对自动下载的文件和手动下载的文件进行了区分(在linux上)。 两个文件的文件大小完全相同,但是,diff说两个文件的二进制内容不同:

    二进制文件file.rar和文件(2).rar不同

    更新2

    5 回复  |  直到 15 年前
        1
  •  2
  •   b_erb    15 年前
        2
  •  1
  •   Thorbjørn Ravn Andersen    15 年前

    您应该运行diff(unix工具)将原始结果与结果进行比较,以找出实际发生了什么变化。你可以马上看到一个图案。

        3
  •  0
  •   dty    15 年前

    我将首先刷新(或关闭)FileOutputStream

        4
  •  0
  •   user207421    15 年前

    您的代码是正确的,只要所有内容都已关闭,并且没有抛出异常。问题出在其他地方,可能在原始文件中。

        5
  •  0
  •   nkr1pt    14 年前