Для моего приложения мне нужно написать метод, который принимает аргумент InputStream
, записывает содержимое во временный файл, выполняет некоторые операции и, наконец, удаляет временные файлы.Обработать временный файл в попытке с ресурсами
Это то, что я до сих пор:
public void myMethod(InputStream in, String name) {
//...
Path path = Paths.get("./tmp/benchmarks/" + name + ".zip")
try {
Files.copy(in, path);
//operations...
} catch (IOException e) {
//error handling for copy...
} finally {
try {
Files.delete(path));
} catch (IOException e) {
//error handling for delete...
}
}
//...
}
Это делает работу, но и выглядит очень некрасиво. Мне было интересно, есть ли способ использовать try-with-resources
, чтобы обработать это более изящно. Возможно ли это как-то?
ОБНОВЛЕНИЕ: Я написал решение «на лету» за десять минут. Это выглядит так:
public class TemporaryFileHandler implements AutoCloseable {
private File file;
public TemporaryFileHandler(final InputStream in, final Path path) throws IOException {
Files.copy(in, path);
this.file = new File(path.toString());
}
public File getFile() { return file; }
@Override
public void close() throws IOException {
Files.delete(file.toPath());
}
}
Я уверен, что это не самое лучшее, но сейчас он работает. Если у кого-то есть предложения по улучшению этого в любом случае, предложения более чем приветствуются.
Вы знаете о 'Files.createTempFile'? –
@RC. да, но использование этого означает, что файл будет удален при завершении работы JVM. В идеале моя JVM не должна закрываться (я разрабатываю REST API). – link
Не пробовал, но что-то похожее на 'try (InputStream in = Files.newInputStream (tempFile, StandardOpenOption.DELETE_ON_CLOSE))' мог бы сработать для вас. Работает с потоками, поэтому, вероятно, это не так удобно, как на основе файлов. – zapl