Utilizando Arquivos e Diretórios

Uma tema que normalmente gera dúvida é o fato de que um objeto do tipo File é usado para representar ou um diretório ou um arquivo.

File file = new File(“caminhoDoFile”);

Existem dois modos de criar um arquivo:

  1. Criar uma Stream ou um Writer. Mais especificamente, criar um PrintWriter, um FileWriter, ou um FileOutputStream.
  2. Chamar o método createNewFile() a partir de um objeto File.
file.createNewFile();

Veja um exemplo completo a seguir:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Principal {
/**
* @param args
*/
public static void main(String[] args) {
try{
PrintWriter pw = new PrintWriter("uuuu");
FileWriter fw = new FileWriter("vvvv");
FileReader fr = new FileReader("xxxx");
FileInputStream fi = new FileInputStream("yyyy");
FileOutputStream fo = new FileOutputStream("zzzz");
}catch (IOException e) {
}
}
}

Do mesmo modo como na criação de um arquivo, criar um diretório é um procedimento de 2 etapas; primeiro, criamos um objeto Directory (File) e logo após criamos o diretório real através do método mkdir().

File dir = new File(“caminhoDiretorio”);

dir.mkdir();

No momento que tivermos um diretório, podemos colocar arquivos.

File arquivo = new File(dir, “arquivo.txt”);

arquivo.createNewFile();

Precisamos ter atenção ao criar novos diretórios. Segundo vimos, criar um Writer ou um Reader criará automaticamente um arquivo; porém, o mesmo não ocorre com os diretórios.

File dir = new File("diretorio");
//dir.mkdir();
File arquivo = new File(dir, "arquivo1.txt");
arquivo.createNewFile();//Exceção se não houver dir.mkdir()

Observe o exemplo:

package devmedia1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class TesteFile {
/**
* @param args
*/
public static void main(String[] args) {
try{
File d1 = new File("diretorio");
d1.mkdir();
File fl = new File(d1,"arq1");
PrintWriter pw = new PrintWriter(fl);
System.out.println(d1.exists());
System.out.println(fl.exists());
System.out.println(d1.isDirectory());
System.out.println(fl.isFile());

FileReader fr = new FileReader(fl);
BufferedReader buffer = new BufferedReader(fr);
String st;
while((st=buffer.readLine())!=null){
System.out.println(st);
}
buffer.close();
}catch (IOException e) {
}
}
}

Muito cuidado ao que método readLine() retorna. Quando não existir mais dados para serem lidos, readLine() retorna o valor null. Esse é o aviso para parar a leitura do arquivo.

Note também que não invocamos um método flush(). Na leitura de um arquivo não é necessário fazer flushing, e você não encontrará um método flush() em uma classe Reader.

O código a seguir evidencia alguns dos recursos mais comuns relativos a apagar arquivos e diretórios através do método delete() e renomear arquivos e diretórios por meio do método renameTo().

import java.io.File;
import java.io.IOException;
public class MetodosFile {
/**
* @param args
*/
public static void main(String[] args) {
try{
File dir = new File("c:\\d1");
dir.mkdir();//cria diretório dir
File arq1 = new File(dir, "arquivo1.txt");
arq1.createNewFile();//cria arquivo1.txt dentro de d1
File arq2 = new File(dir, "arquivo2.txt");
arq2.createNewFile();//cria arquivo2.txt dentro de d1
d1.delete();//tenta remover d1, mas não consegue, pois dir não está vazio!
arq1.delete();//apaga arq1

File d2 = new File("c:\\newdir");
dir.renameTo(d2);//d1 é renomeado para newdir

File novo = new File(dir, "newarquivo.txt");
arq2.renameTo(novo);//arquivo2.txt é renomeado para newarquivo.txt

}catch (IOException e) {
}
}
}

Partindo do pressuposto de que temos um diretório chamado d1, no qual almejamos fazer uma busca, o próximo código utiliza o método File.list() para criar um array String de arquivos e diretórios, nos quais usamos o loop for aprimorado para iterar e exibir.

import java.io.File;
public class MetodosDeFile {
/**
* @param args
*/
public static void main(String[] args) {
String []arquivos = new String[50];
File dir = new File("c:\\");
arquivos = dir.list();
for(String s: arquivos)
System.out.println(s);
}
}

Na próxima parte do artigo falaremos da classe Console e Serialização.


Leia todos artigos da série