Manipulando arquivos com Java
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.
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.
Muito bom cara!!! me ajudou muito valew