• Nenhum resultado encontrado

Manipulando arquivos

No documento Programação_Orientada_ObjetoII (páginas 70-77)

O Java disponibiliza uma classe, que representa tanto arquivos, quanto diretórios. Essa classe é o File, que permite um gerenciamento, como,

verificar se um arquivo/diretório existe, exclui arquivos/diretórios ou mesmo ler informações.

Veja alguns métodos importantes da classe File:

boolean canRead(): verifica se tem permissão para leitura;

boolean canWrite(): verifica se tem permissão para escrita;

boolean compareTo(File outroArquivo): compara dois caminhos

de arquivos;

boolean delete: exclui o arquivo. No caso de diretório, ele precisa

estar vazio;

boolean exists(): verifica se o caminho passado existe;

boolean isAbsolute(): verifica se o caminho passado é absoluto;

boolean isDirectory(): verifica se o caminho é um diretório;

boolean isHidden (): verifica se é oculto;

boolean mkdir(): cria um diretório com o caminho do File;

boolean renameTo(File dest): renomeia o arquivo/diretório;

File[] listFiles: lista os arquivos contidos em um diretório. Caso,

não seja um diretório, retorna null;

long lastModified(): retorna a última modificação do arquivo;

long length(): retorna o tamanho do arquivo;

String getAbsolutePath(): retorna o caminho absoluto;

String getName(): retorna o nome do arquivo ou diretório;

String[] list: lista os nomes dos arquivos contidos de um diretório.

Caso, não seja um diretório, retorna null;

void setReadOnly(boolean readable): modifica o atributo do

Veja um exemplo de uso da classe File: import java.io.File;

public class ListandoArquivos {

public static void main(String args[]){

for(File root : File.listRoots()){ //lista os diretórios raizes System.out.println(“Raiz: “+root.getAbsolutePath()); if(root.listFiles() == null){ // se não possui lista de arqivos continue; //continua no próximo laço

}

for(File arq : root.listFiles()){ //lista os diretórios raizes System.out.print(“ “+arq.getAbsolutePath()); if(arq.isHidden()){ //se for oculto, exibe (o) System.out.print(“ (o)”);

}

if(arq.isDirectory()){

System.out.print(“ (d)”); //se for dir, exibe (d) }else{

//senão, exibe o tamanho

System.out.print(“ tam:”+arq.length()); }

System.out.println(“”); }

//verifica se tem diretório temp no raiz, se não tiver tenta criar File temp = new File(root.getAbsoluteFile()+”Temp\\”); if(temp.exists() == true){

System.out.print(“Criando diretório temporário...”); try{

temp.mkdir();

}catch(SecurityException e){

System.out.print(“ Permissão negada!”); } finally{ System.out.println(); } } else{

System.out.println(“Já possui diretorio temporário!”); }

} } }

Quando a instância que a classe File se referencia é um diretório, existem dois métodos para retornar o seu conteúdo (arquivos que possuem): list( ) e o listFiles( ). Esses métodos possuem, além da implementeção que não recebe argumentos, uma construtora que permite passar como parâmetro um objeto da interface FilenameFilter.

A interface FilenameFilter tem um método abstrato accept( ), que, quan- do implementado, retorna um array de File. O conteúdo do array são Strings, que representam arquivos e diretórios. O método accept( ) filtra o retorno dos dois métodos (list( ) e listFiles( )), por exemplo, pode-se definir um filtro para que sejam retornados somente arquivos .exe e .com. Observe um exemplo de como criar um novo tipo de execução:

import java.io.File;

public class ListandoArquivos {

public static void main(String args[]){

for(File root : File.listRoots()){ //lista os diretórios raizes System.out.println(“Raiz: “+root.getAbsolutePath()); if(root.listFiles() == null){ // se não possui lista de arqivos continue; //continua no próximo laço

}

for(File arq : root.listFiles()){ //lista os diretórios raizes System.out.print(“ “+arq.getAbsolutePath()); if(arq.isHidden()){ //se for oculto, exibe (o) System.out.print(“ (o)”);

}

if(arq.isDirectory()){

System.out.print(“ (d)”); //se for dir, exibe (d) }else{

//senão, exibe o tamanho

System.out.print(“ tam:”+arq.length()); }

System.out.println(“”); }

//verifica se tem diretório temp no raiz, se não tiver tenta criar File temp = new File(root.getAbsoluteFile()+”Temp\\”); if(temp.exists() == true){

System.out.print(“Criando diretório temporário...”); try{

temp.mkdir();

}catch(SecurityException e){

System.out.print(“ Permissão negada!”); } finally{ System.out.println(); } } else{

System.out.println(“Já possui diretorio temporário!”); }

} } }

Agora, veja um exemplo de lista de arquivos com uso de filtro.

package com.senai.file; import java.io.File;

import java.io.FilenameFilter;

class FiltroExe implements FilenameFilter { public boolean accept(File dir, String arq) { return arq.endsWith(“.exe”);

} }

public class ListandoFileFiltro {

public static void main(String args[]) { //lista os diretórios raizes

for (File root : File.listRoots()) { // se não possui lista de arqivos if (root.listFiles() == null) { //continua no próximo laço continue;

}

//lista os aquivos exe e com

for (File arq : root.listFiles(new FiltroExe())) { System.out.print( arq.getAbsolutePath()); //se for oculto, exibe (o)

if (arq.isHidden()) { System.out.print(“ (o)”); }

System.out.println(“ tam:” + arq.length()); }

} } }

A operação de leitura deve ser fei- ta por meio do uso de classes de- rivadas da classe abstrata InputS- tream. Os métodos básicos do InputStream são:

int read()

int read(byte[])

int read(byte[ ], int ini, int tam)

void close()

int available()

void skip(long tam)

Uma das classes concretas, de- rivadas da InputStream, é Fi- leInputStream. Ela permite re-

alizar operações sobre arquivos, como, ler um byte do arquivo, por exemplo. Na instanciação de um FileInputStream, deve-se passar o caminho do arquivo que será lido. A leitura de arquivos-texto é realizada pelas classes FileInputS- tream, InputStreamReader e Bu- fferedReader. Um exemplo de lei- tura de arquivo pode ser visto na figura a seguir.

Figura 37: Leitura de arquivo texto

O FileInputStream lê bytes. O InputStreamReader, uma derivada da classe Reader, lê caracteres, o que facilita a manipulação de arquivos- -texto. A classe BufferedReader permite ler linhas inteiras por meio do método readLine.

Além de ser possível ler de arquivos, pode-se ler as entradas, feitas pelo usuário, em um console. Essa operação pode é feita, substituindo a ins- tanciação do objeto FileInputStream e passado como parâmetro o Sys- tem.ini para o InputStreamReader. O código, desse exemplo, pode ser visto a seguir.

try {

Reader inputStreamReader = new InputStreamReader(System.in); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); System.out.println(“Lendo do teclado”);

for (String linha = “”;

linha != null && linha.equals(“fim”)!=true; linha = bufferedReader.readLine()) { System.out.println(“linha lida:” + linha); }

} catch (FileNotFoundException ex) {

System.out.println(“Ocorreram problemas ao abrir arquivo”); } catch (IOException ex) {

System.out.println(“Ocorreram problemas ao abrir arquivo”); }

Similar à leitura, a operação de gravação deve ser feita por meio do uso de classes derivadas da classe abstrata OutputStream. Os métodos bási- cos do OutputStream são:

void write(int a)

void write(byte[])

void write(byte[], int ini, int tam)

void close()

void flush()

A gravação de arquivos-texto é um trabalho em conjunto, entre as clas- ses FileOutputStream, OutputStreamWriter e BufferedWriter. FileOu- tputSream permite gravar um byte. O OutputStreamWriter grava um char, e o BufferedWriter, grava Strings. Um exemplo de gravação de arquivo pode ser visto na figura 38.

Outra forma de ler/gravar arquivo, empregando uma implemen- tação disponível no Java, de mais alto nível, é utilizando as clas- ses: java.io.FileWriter/java.io.PrintWriter e java.io.FileReader e java. io.BufferedReader. Observe, agora, um exemplo do uso dessas classes no código a seguir. package com.senai.file; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import javax.swing.JOptionPane; public class FileReaderWriter {

public static void main(String[] args) { //Gravando o arquivo

try {

FileWriter writer = null;

writer = new FileWriter(“c:\\temp\\alice.txt”); PrintWriter saida = new PrintWriter(writer);

saida.println(“- Nesta direção, disse o Gato, girando a pata direita,” +“ mora um Chapeleiro. “);

saida.println(“E nesta direção, apontando com a pata esquerda,” +”mora uma Lebre de Março.”);

saida.close(); writer.close();

} catch (IOException ex) {

System.out.println(“Ocorreram problemas ao gravar arquivo”); }

// Lendo gravando try {

FileReader reader = new FileReader(“c:\\temp\\alice.txt”); BufferedReader leitor = new BufferedReader(reader); String linha = null;

while ((linha = leitor.readLine())!=null) {

JOptionPane.showMessageDialog(null, linha); }

} catch (IOException ex) {

System.out.println(“Ocorreram problemas ao abrir arquivo”); }

} }

SEÇÃO 3

No documento Programação_Orientada_ObjetoII (páginas 70-77)

Documentos relacionados