Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida com Try With Resources Aninhados

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;
    }
1 resposta
solução!

Olá, Ricardo.

O seu código (o 2o.) recebe esse UploadedFile como parâmetro, né?

Parâmetros não podem ser usados num try-with-resources. Na verdade, nem qualquer objeto criado antes. Apenas objetos que foram declarados no try serão fechados automaticamente. E outra coisa: as classes desses objetos precisam implementar a interface AutoCloseable.

Aliás, é o UploadedFile do PrimeFaces? Se sim, ele NÃO implementa AutoCloseable


No 1o. exemplo estamos declarando dois recursos que implementam AutoCloseable: FileInputStream e FileOutputStream. Aí, podemos usar ambos dentro do try-with-resources. Basta separá-los por ; dentro do try.

Detalhe: um File é apenas um apontador para o arquivo e não lança IOException. Também não faz nada até alguém usá-lo.

Então, teríamos:

public class CopyFileExample
{
    public static void main(String[] args)
    {

        File afile =new File("Afile.txt");
        File bfile =new File("Bfile.txt");

        try ( InputStream inStream = new FileInputStream(afile); OutputStream outStream = new FileOutputStream(bfile)) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inStream.read(buffer)) > 0){
                outStream.write(buffer, 0, length);

            }
            System.out.println("Arquivo copiado!");
        } catch(IOException e){
            e.printStackTrace();
        }
    }
}