0

我正在使用代码将内容从 url 写入文件。这是代码

public void copyFileFromUrl(URL source, File target) throws IOException {
    try {

        if (!target.exists()) {

            target.createNewFile();
            log.debug("target file created for " + target);

            log.debug("downloading source ....");
            InputStream in = source.openStream();
            OutputStream out = new FileOutputStream(target);

            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }

        } else {
            log.debug("skipping creation of asset");
        }

    } catch (Exception e) {
        log.debug("trouble with " + target);
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        in.close();
        out.close();
    }

}

现在发生了什么,假设文件大小为 40kb,现在在写入过程中,如果我有连接重置或任何类型的异常,那么所有内容都没有完全写入,或者有时什么都没有写入,我有一个大小为 0 或更小的文件比网址上的原始文件。

我想问有没有什么方法可以保证整个文件完全是从 url 写入的,如果在写入过程中出现任何异常,那么我会尝试三次写入,第三次尝试后我会记录文件不是的消息写的完整吗?

谢谢

4

2 回答 2

0

在这段代码之后,您就知道您已经成功复制了。

        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

在方法之外将全局 int 设置为 0,并在上述块完成后将其设置为 -1。将 1 添加到 catch 块内的全局 int 。

您执行该方法,直到全局 int 小于零或大于 3。您还必须在每次遇到异常时删除目标文件,因此您不会因该条件而失败。

于 2013-04-29T13:22:37.200 回答
0

你可以尝试这样的事情:

public void copyFileFromUrl(URL source, File target, int count) throws IOException {
try {

    if (!target.exists()) {

        target.createNewFile();
        log.debug("target file created for " + target);

        log.debug("downloading source ....");
        InputStream in = source.openStream();
        OutputStream out = new FileOutputStream(target);

        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

    } else {
        log.debug("skipping creation of asset");
    }

} catch (Exception e) {
    log.debug("trouble with " + target);
    if(count < 3){
        target.delete();
        copyFileFromUrl(source, target, count++);
    }
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    in.close();
    out.close();
}

}

于 2013-04-29T13:22:53.107 回答