ОБНОВЛЕНИЕ 2: Пожалуйста, закройте этот вопрос
После дальнейшей отладки обнаруживается, что проблема не во внутреннем блоке try, а в баге внутри цикла while.Там было вызвано исключение, которое не было перехвачено, поэтому пропускает внутренний блок try.Извиняюсь за мою ошибку, пожалуйста, удалите эту ветку.
ОБНОВЛЕНИЕ: добавлено ведение журнала для сбора ошибок при удалении.
Я загружаю 8000-ые файлы 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, чтобы закрыть сканер.
Любые предложения очень ценятся.