Конструктор FileInputStream
пытается открыть поток файлов, поэтому он должен быть частью вашего блока try
.Напоминание: всегда готовьтесь к неудаче, если результат операции не в ваших руках (например, файловая система, база данных и сеть).Вам также необходимо убедиться, что вы стараетесь закрыть файловый поток независимо от того, что произошло после его открытия, чтобы обеспечить освобождение дескриптора файла.
Для этого предназначен блок finally
.Этот блок выполняется независимо от того, что происходит в блоке try
и catch
.
- Нет исключений?
finally
выполняется в конце. - Произошло исключение,
catch
выполнено?finally
выполняется в конце. - Произошло исключение,
catch
не распространяется на исключение?finally
выполняется в конце. - Произошло исключение,
catch
выполнено, но выдает другое исключение?finally
выполняется в конце.
Однако при выполнении finally
вы можете не знать точные обстоятельства, в которых вы находитесь в отношении потока файлов (например, поток файлов даже не может бытьоткрыт для начала, так что вы тоже не сможете его закрыть).Таким образом, вы все равно должны просто try
закрыть поток.
for (x=1; x LTE ArrayLen(fileList); x=x+1) {
pathToEmailFile = fileList[x];
deleteFile = false;
try {
this.fileSource = createObject("java", "java.io.FileInputStream").init(pathToEmailFile);
// your extraction code...
deleteFile = true; // extraction succeeded, delete file after releasing it
} catch (any e) {
// log the exception
} finally {
// try to close the file stream
try {
this.fileSource.close();
} catch (any e) {
// file stream was probably not even opened
}
}
if (deleteFile) {
try {
fileDelete(pathToEmailFile);
} catch (any e) {
// file could not be deleted, probably for the same reasons it failed previously
}
}
}
Я не уверен, действительно ли вы намереваетесь удалить файл независимо от результата извлечения, поэтому я добавил логику для этого, и вы решилидля себя.
Также Ageax правильно соблюдается:
Я заметил, что код использует это.область действия, которая может создать проблему, если контейнер является cfc, хранящимся в общей области, то есть в условиях гонки.
Есть ли причина для наличия fileSource
в области действия this
?Вы не должны использовать открытое поле (this
может иметь доступ извне компонента) для временной переменной.