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