Java: удаление файлов gz иногда не удавалось - PullRequest
0 голосов
/ 23 июня 2019

ОБНОВЛЕНИЕ 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, чтобы закрыть сканер.

Любые предложения очень ценятся.

1 Ответ

1 голос
/ 23 июня 2019

Без возможности заглянуть в ваши файлы журналов или отладить систему из первых рук, почти невозможно сказать вам, что здесь происходит не так.

Но что вы определенно можете сделать: сделать этот вызовк FileUtils.forceDelete(downloadTo); в блоке finally, например.

Весь смысл try / catch / finally заключается в том, чтобы вы могли принудительно выполнять определенные действия всегда, независимо от того, что происходило в блоке try!

Также обратите внимание: если вы не можете сказать, что делает ваш код, добавьте к нему поддержку logging .Таким образом, вместо printStackTrace(); вы записываете все исключение в место, где оно не теряется.

Значение: реальный ответ здесь заключается в том, что вы делаете шаг назад и предпринимаете необходимые действия, чтобы выяснить, откуда возникают ваши проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...