Um arquivo é aberto para leitura criando um objeto
FileInputStream
.O construtor
FileInputStream(String nomeArquivo)
lançaFileNotFoundException
se o arquivo não existir.FileNotFoundException
é uma subclasse deIOException
.Para ler um arquivo, usa-se o método
read()
, que lê um byte e retorna um valor inteiro.read()
retorna -1 quando o fim do arquivo é alcançado e lançaIOException
em caso de erro.Após o uso, o arquivo deve ser fechado com o método
close()
para liberar recursos do sistema.Não fechar o arquivo pode causar vazamentos de memória.
O programa de exemplo usa
read()
para exibir o conteúdo de um arquivo e utiliza blocostry/catch
para tratar erros de I/O.Obs.: Em Java, um vazamento de memória ocorre quando o programa não libera recursos de memória que ele não está mais usando, mantendo esses recursos ocupados sem necessidade. Embora a linguagem tenha coleta automática de lixo (garbage collection) para objetos não referenciados, essa coleta não lida diretamente com recursos externos, como arquivos ou conexões de rede. Se você não fecha o arquivo, os recursos do sistema permanecem ocupado, tende-se o desempenho degradado e apresentação de erros e falhas (ao tentar abrir outro arquivo, por exemplo).
O exemplo anterior fecha o fluxo após o bloco try de leitura do arquivo.
Java permite uma abordagem alternativa: chamar
close()
dentro de um blocofinally
.Com o bloco
finally
, o arquivo é fechado independentemente de como o blocotry
termine.Essa abordagem garante o fechamento do arquivo, mesmo que ocorra uma exceção.
O bloco try acessa o arquivo, e o finally é usado exclusivamente para fechá-lo.
A vantagem de usar o bloco finally é garantir o fechamento do arquivo, mesmo se uma exceção não relacionada a I/O ocorrer.
Embora não seja crítico em programas pequenos, essa abordagem é essencial em programas maiores para evitar problemas.
O uso de
finally
ajuda a evitar o incômodo de lidar com arquivos não fechados em caso de exceções inesperadas.Encapsular a abertura e o acesso ao arquivo em um único bloco
try
e usarfinally
para fechá-lo é uma prática recomendada.Essa abordagem pode simplificar o código e garantir a liberação dos recursos.
fin
é inicializada comonull
e, no blocofinally
, o arquivo só é fechado sefin
não fornull
.Isso evita que
close()
seja chamado se ocorrer uma exceção ao abrir o arquivo.A sequência try/catch pode ser simplificada, pois
FileNotFoundException
é uma subclasse deIOException
.Capturar apenas
IOException
elimina a necessidade de capturarFileNotFoundException
separadamente.Nesse caso, a mensagem de exceção padrão descreve o erro.
...
} catch(IOException exc) {
System.out.println("I/O Error: " + exc);
} finally {
...