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 caminhosde arquivos;
▪
boolean delete: exclui o arquivo. No caso de diretório, ele precisaestar 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 doVeja 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”); }
} }