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