如何确保url中的文件内容成功写入文件

时间:2013-04-29 13:11:42

标签: java

我正在使用代码将内容从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,现在在写入期间如果我有连接重置或任何类型的异常,那么所有内容都没有完全写入或有时没有写入任何内容我有一个文件taht有0大小或小于网址上原始文件的大小。

我想问一下,有什么方法可以确保整个文件完全是从网址写的,如果在编写过程中有任何异常,那么我会尝试三次写入,并在第三次尝试后记录消息文件没有写完?

由于

2 个答案:

答案 0 :(得分:0)

在此代码块之后,您知道您已成功复制。

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

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

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

答案 1 :(得分: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();
}

}