Java:偶尔删除gz文件失败

时间:2019-06-23 18:15:30

标签: java io

更新2:请关闭此问题

进一步调试后,发现问题不在内部try块中,而是在“ while”循环中的错误。在那里引起了异常,但没有捕获到异常,因此跳过了内部try块。对我的错误表示歉意,请删除此线程。

UPDATE:添加了日志记录以捕获删除期间的错误。

我正在从服务器下载8000ish GZ文件,在本地处理其内容,然后在完成后删除下载的副本。我在多个线程上运行此线程,每个线程处理不相交的一批GZ文件。但是我不明白由于什么原因我的代码偶尔(并非总是)无法成功删除GZ文件。该代码通常如下所示:

....
private static final Logger LOG = Logger.getLogger(....class.getName());

.....


for (String inputGZFile : gzFiles) { //gzFiles is a list of urls to be process by this thread
    try {
        File downloadTo = new 
        File(this.outFolder + "/" + new File(downloadFrom.getPath()).getName());
        FileUtils.copyURLToFile(downloadFrom, downloadTo);

        InputStream fileStream = new FileInputStream(downloadTo);
        InputStream gzipStream = new GZIPInputStream(fileStream);
        Reader decoder = new InputStreamReader(gzipStream, Charset.forName("utf8"));
        Scanner inputScanner = new Scanner(decoder);
        inputScanner.useDelimiter(" .");

        while (inputScanner.hasNextLine() && (content = inputScanner.nextLine()) != null) {
                //do something
        }

        try {
                inputScanner.close();
                FileUtils.forceDelete(downloadTo);
            }catch (Exception e){
                LOG.info("\t thread " + id + " deleting gz file error "+ inputGZFile);
                LOG.info("\t thread " + id+ExceptionUtils.getFullStackTrace(e));
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}

我能想到的唯一原因是扫描程序没有关闭文件或释放文件句柄。但这很奇怪,因为我已经调用了close方法来关闭扫描仪。

任何建议都受到高度重视。

1 个答案:

答案 0 :(得分:1)

由于无法查看日志文件或进行第一手调试,几乎无法告诉您这里出了什么问题。

但是您绝对可以做的:例如,在finally块中调用FileUtils.forceDelete(downloadTo);

try / catch / finally的全部目的是使您能够强制始终执行特定的操作,无论try块中发生了什么!

还请注意:如果您无法确定代码的功能,请为其添加记录支持。因此,您可以将整个异常记录到不会丢失的地方,而不是printStackTrace();

含义:真正的答案是您退后一步并采取必要的措施来找出问题的根源。