Software, Java & afins

Fabricio Braga, Sun Certified

Manipulando arquivos com Java

escrito por Fabricio Braga em Apr 2006

Mesmo sendo um tema razoavelmente conhecido por programadores Java mais experientes, é bastante útil saber das principais features oferecidas pela API para manipulação de arquivos e diretórios usando Java.

Desde as primeiras versões do JDK a Sun vem melhorando a API de entrada e saída do Java.? As maiores mudanças vieram na mudança do JDK 1.3.1 para a 1.4

Vejamos alguns exemplos mais utilizados no dia-a-dia…

Lendo texto de um arquivo:

[sourcecode language='java']
try {
  BufferedReader in = new BufferedReader(
  new FileReader("arquivo.txt"));
  String linha;
  while ((linha = in.readLine()) != null) {
 //faz alguma coisa com a? String...
  }
  in.close();
 } catch (IOException e) {
 }
[/source]

Não é muito complicado.? Lembre-se sempre de que quando usamos classes que criam streams de entrada/saída devemos tratar IOException.

Escrevendo em um arquivo:


try {
  BufferedWriter out = new BufferedWriter(
  new FileWriter("arquivo.txt"));
  out.write("blah blah blah...");
  out.close();
} catch (IOException e) {
}

Também não é muito difícil, nesse caso, se o arquivo não existir ele será automaticamente criado.? Se ele existir, o texto contido nele será sobrescrito.

Adicionando texto ao final do arquivo:


try {
  BufferedWriter out = new BufferedWriter(
  new FileWriter("arquivo.txt", true));
  out.write("blah blah blah...");
  out.close();
} catch (IOException e) {
}

Similar ao anterior, com a diferença de que agora passamos um parâmetro a mais no construtor da classe FileWriter, significando que o método write deve adicionar texto ao final do arquivo, mantendo o original.

Como saber o diretório atual da aplicação:


String? diretorioAtual = System.getProperty("user.dir");

Deletando um diretório:


  boolean deletado = (new File
  ("nomeDiretorio")).delete();
if (!deletado) {
// falhou...
}

Este código vai deletar um diretório se ele estiver vazio.? Caso o diretório não esteja vazio, é necessário primeiro deletar recursivamente todos os arquivos e subdiretórios dentro deste diretório.? Aqui um método que faria isso:


// Retorna verdadeiro se todos os deletes funcionarem
// Se um delete falhar, o método para, e retorna falso
public static boolean deleteDir(File dir) {
  if (dir.isDirectory()) {
  String[] subDiretorio = dir.list();
  for (int i=0; i < subDiretorio.length; i++) {
  boolean deletado = deleteDir(
  new File(dir, subDiretorio[i]));
  if (!deletado) {
  return false;
  }
  }
  }

  //? O diretorio agora está vazio, então removemos ele:
  return dir.delete();
}

Copiando um diretório para dentro de outro:


? // Copia todos os arquivos sob o srcDir para o dstDir.
? // Se dstDir não existir, ele será criado.
? public void copiaDirectorio(File srcDir, File dstDir)
  throws IOException {
  if (srcDir.isDirectory()) {
  if (!dstDir.exists()) {
  dstDir.mkdir();
  }
?
  String[]? subDiretorios = srcDir.list();
  for (int i=0; i < subDiretorios.length; i++) {
  copyDirectory(new File(srcDir, subDiretorios[i]),
  new File(dstDir, subDiretorios[i]));
  }
  } else {
  //? Copiando o arquivo
  // Cria um FileChannel para o arquivo de origem:
 FileChannel srcChannel = new FileInputStream(
  srcDir).getChannel();

  // Cria um FileChannel para o arquivo de destino:
  FileChannel dstChannel = new FileOutputStream(
  dstDir).getChannel();

 // Copia o conteúdo:
  dstChannel.transferFrom(srcChannel, 0,
  srcChannel.size());

 // Fecha os FileChannels
  srcChannel.close();
  dstChannel.close();
  }
? }

Neste exemplo utilizamos a classe FileChannel para facilitar a cópia dos arquivos.

Acredito que coloquei aqui algumas das principais dúvidas dos programadores iniciantes para manipular arquivos e diretórios com Java.? É sempre bom lembrarmos que a cada, nova especificação da JVM o JCP busca otimizar as features de entrada e saída, então é bom estarmos sempre em sintonia com as novidades das especificações.


  1. Pedro Furlanetto Said,

    Maneiro, o FileChannel. Vale mencionar que o FileChannel pode ser interrompido pelo Thread.interrupt, o que não acontecia com as classes antigas de IO.

  2. Daniel Said,

    Muito bom cara!!! me ajudou muito valew