Olá, uma ótima feature que o Java 7 trouxe foi esse recurso de auto close. mas geralmente quando trabalhamos com arquivos normalmente temos um fluxo de entrada e um fluxo de saída, como fica a sintaxe deste recurso quando quero garantir que todas as streams vão ser fechadas. Um exemplo básico é a cópia de um arquivo, onde tenho que garantir fechar tanto o input, quanto o output stream
public class CopyFileExample
{
public static void main(String[] args)
{
InputStream inStream = null;
OutputStream outStream = null;
try{
File afile =new File("Afile.txt");
File bfile =new File("Bfile.txt");
inStream = new FileInputStream(afile);
outStream = new FileOutputStream(bfile);
byte[] buffer = new byte[1024];
int length;
while ((length = inStream.read(buffer)) > 0){
outStream.write(buffer, 0, length);
}
inStream.close();
outStream.close();
System.out.println("Arquivo copiado!");
}catch(IOException e){
e.printStackTrace();
}
}
}
No meu caso a situação é até mais simples, já estou fechando o outputstreamcom o try-with-resources, mas queria fechar também a stream do arquivo que recebi por upload, mas não sei a sintaxe para aninhar os comandos try-whith-resource
@Override
public String salvarTemporariamente(UploadedFile files) {
String novoNome = null;
if(files != null && files.getSize() > 0){
novoNome = renomearArquivo(files.getFileName());
try(FileOutputStream fos = new FileOutputStream(new File(this.localTemporario.toAbsolutePath().toString() + FileSystems.getDefault().getSeparator() +novoNome))){
files.writeTo(fos);
files.getFile().close();
files = null;
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("erro ao salvar imagem no diretório temporário");
}
}
return novoNome;
}