Как прокомментировал Джон Скит, вы должны закрыть свой файл в блоке finally {...}, чтобы он всегда был закрыт. И вместо того, чтобы проглотить исключения с помощью e.printStackTrace, просто не перехватывайте и не добавляйте исключение в сигнатуру метода. Если вы не можете по какой-либо причине, по крайней мере, сделайте следующее:
catch(IOException ex) {
throw new RuntimeException("Error processing file XYZ", ex);
}
Теперь вопрос № 2:
Что если вы сделаете это:
...
to.close();
System.out.println("Please delete the file and press <enter> afterwards!");
System.in.read();
...
Сможете ли вы удалить файл?
Кроме того, файлы сбрасываются при закрытии. Я использую IOUtils.closeQuietly (...), поэтому я использую метод flush, чтобы убедиться, что содержимое файла есть, прежде чем пытаться его закрыть (IOUtils.closeQuietly не выдает исключений). Примерно так:
...
try {
...
to.flush();
} catch(IOException ex) {
throw new CannotProcessFileException("whatever", ex);
} finally {
IOUtils.closeQuietly(to);
}
Так что я знаю, что там находится содержимое файла. Поскольку для меня обычно имеет значение, что содержимое файла записано, а не то, может ли файл быть закрыт или нет, действительно не имеет значения, был ли файл закрыт или нет. В вашем случае, если это имеет значение, я бы порекомендовал закрыть файл самостоятельно и обработать все исключения согласно.