Data_Flux - F4NT0/J4V4 GitHub Wiki
Retornar |
---|
Criar um bom sistema de Entrada e Saída é uma das tarefas mais delicadas na programação, pois há diversas abordagens diferentes. Além disso, é necessário tratar várias origens e destinos para os dados. Finalmente, há vários modos de acesso: Sequencial,Aleatório,com ou sem buffer,por palavras,binário,etc..
Para resolver esse problema, Java provê uma biblioteca com muitas classes, cada uma com um propósito diferente.
Essas classes estão essencialmente em dois pacotes: java.io e java.nio.files. De maneira geral, essas estruturas definem E/S em termos de fluxos(chamados de Streams)
Fluxo de Entrada(Input Stream)
Fluxo de Saída(Output Stream)
O pacote java.io fornece dois tipos de streams:
-
Fluxo de bytes: tratam entrada ou saida de dados em 8 bits
- Para E/S(I/O) baseada em dados binários(ex: uma imagem)
- Objetos InputStream, OutputStream
-
Fluxo de caractere: tratam entrada ou saída de caracteres Unicode(16 bits)
- Para E/S(I/O) baseada em texto(Ex: arquivos .txt ou XML)
- Objetos Reader,Writer
O pacote java.nio.file foi introduzido no Java 7, e oferece uma interface mais robusta e moderna para a manipulação específica de arquivos, também corrigindo diversos bugs e incompatibilidades ainda presentes em java.io, apresentando um desempenho mais elevado , operando diretamente com canais de E/S.
- A classe Path
A classe Path representa um caminho em um sistema de arquivos, armazenando o nome de um arquivo e a lista de diretórios usada para construir o caminho para um arquivo ou diretório: Ex: /home/user/...
É usada para examinar,localizar e manipular arquivos, mas seu conteúdo depende do Sistema Operacional. Por exemplo, no Windows os caminhos podem começar pela letra de uma unidade("C:").
- A classe Paths
Diferente da classe Path, a classe Paths faz operações sobre caminhos, onde com esta classe podemos Criar caminhos novos
Ex: Criando um caminho novo:
Path path1 = Paths.get("/home/user2/statusReport");//Linux
Path path2 = Paths.get("/home","user","Desktop"); // Linux
Path path3 = Paths.get("C:\\temp\\dados.txt"); //Windows
Ex: Obtendo informações do Caminho:
System.out.println("toString: " + path1.toString()); // /home/user2/statusReport
System.out.println("getFileName: " + path1.getFileName()); // statusReport
System.out.println("getName(0): " + path1.getName(0)); // home
System.out.println("getNameCount: " + path1.getNameCount()); // 3
System.out.println("subpath(0,2): " path1.subpath(0,2)); // /home/user2
System.out.println("getParent: " + path1.getParent()); // /home/user2
System.out.println("getRoot: " + path1.getRoot()); // Windows: C:\ Linux: /
- A classe Files
A classe Files oferece métodos estáticos para a manipulação de arquivos, como:
- Criar um novo arquivo
- Ler dados do arquivo
- Gravar dados no arquivo
- Remover um arquivo
- Alterar permissões
Importante: qualquer operação que envolva arquivos pode falhar, por isso a única forma de tratar situações de erro com arquivos é através de exceções. As exceções de arquivos são todas derivadas de IOException e como já vimos, são verificadas(Olhar documentação sobre exceções), portanto devemos capturar e tratar as exceções ou tratá-las através de throws
O comando try permite que seja especificado um ou mais recursos
Recurso é algo que deve ser liberado quando o programa termina(arquivo, conexão para banco de dados, etc...). O recurso só estará em uso dentro do bloco try, ou seja, quando terminar o recurso será automaticamente liberado. Isso é fundamental para arquivos,pois é preciso abri-los antes de usar, e fechá-los no final. Porém se ocorrer uma exceção, é preciso garantir que serão fechados mesmo assim.
Ex:
try(PrintWriter arq = new PrintWriter("texto.txt"))
{
// Código que usa o Recurso
}
catch(<exceção>)
{
//Código que trata a exceção
}
//Neste ponto, o arquivo texto.txt não existe mais e o arquivo já foi liberado