进一步调试后,发现问题不在内部try块中,而是在“ while”循环中的错误。在那里引起了异常,但没有捕获到异常,因此跳过了内部try块。对我的错误表示歉意,请删除此线程。
我正在从服务器下载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方法来关闭扫描仪。
任何建议都受到高度重视。
答案 0 :(得分:1)
由于无法查看日志文件或进行第一手调试,几乎无法告诉您这里出了什么问题。
但是您绝对可以做的:例如,在finally块中调用FileUtils.forceDelete(downloadTo);
。
try / catch / finally的全部目的是使您能够强制始终执行特定的操作,无论try块中发生了什么!
还请注意:如果您无法确定代码的功能,请为其添加记录支持。因此,您可以将整个异常记录到不会丢失的地方,而不是printStackTrace();
。
含义:真正的答案是您退后一步并采取必要的措施来找出问题的根源。