"Oi, amigo. Quanto tempo, não te vejo."

"Oi, Bilaabo. Sobre o que você vai falar?"

"Hoje vou falar sobre como trabalhar com arquivos.  Java tem uma classe especial (File) que você pode usar para gerenciar arquivos em um disco rígido. Para gerenciar o conteúdo do arquivo, existem outras classes: FileInputStream, FileOutputStream, etc. "

Arquivo, arquivos, caminho - 1

"Interessante. Mas quando você diz 'gerenciar arquivos', o que quer dizer?"

"É exatamente isso que vou explicar agora. Os arquivos podem ser criados, excluídos, renomeados e muito mais. Você pode passar um objeto File para praticamente todas as classes que trabalham com (lê, escreve, altera) o conteúdo de um arquivo . Por exemplo:"

Você pode passar o nome do arquivo diretamente para FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Ou você pode criar um objeto File separadamente e depois passá-lo para FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Mas a segunda opção é mais longa. Ainda não entendo por que precisamos desses objetos de arquivo."

"Para este exemplo específico, você está certo. "Este não é um exemplo de como você deve fazê-lo, mas sim de como você pode fazê-lo.
Mas imagine que você precise exibir uma lista de todos os arquivos localizados em um diretório específico. Veja como isso pode ser feito usando objetos File:"

Código
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

" ListFiles() é um método que retorna uma lista de arquivos na pasta indicada por «c:/path/»?"

"Sim. Mas os programadores costumam dizer 'diretório'. O termo 'pasta' entrou em uso relativamente recentemente, mas, em princípio, ambos os termos estão corretos e você pode dizer o que preferir."

"OK. E o que getName () faz? Retorna o nome do arquivo? O que exatamente está incluído no nome? O nome completo, incluindo o caminho, ou apenas o nome do próprio arquivo?"

"Apenas o nome do próprio arquivo. Para o caminho completo, existe file.getAbsolutePath()."

"Então, quais outros métodos a classe File tem?"

"Dê uma olhada neste:"

Método Descrição
boolean isDirectory() O objeto File é um diretório?
boolean isFile() O objeto é um arquivo?
long length() Retorna o tamanho/comprimento do arquivo em bytes.
boolean createNewFile() Cria um novo arquivo vazio se ainda não existir um arquivo com esse nome.
boolean mkdir() Cria um diretório. O nome «mkdir» vem de «fazer diretório».
boolean mkdirs() Cria um diretório e todos os seus subdiretórios.
boolean delete() Exclui o arquivo associado ao objeto. Se o objeto for um diretório, o diretório será excluído apenas se não houver arquivos nele.
void deleteOnExit() Adiciona o arquivo a uma lista especial de arquivos que serão excluídos automaticamente quando o programa for encerrado.
File createTempFile(
String prefix,
String suffix,
File directory)
Cria um arquivo temporário com um nome exclusivo gerado aleatoriamente, algo como «dasd4d53sd».
Parâmetros adicionais são um prefixo e um sufixo de nome. Se um diretório não for especificado, o arquivo será criado em um diretório especial do sistema operacional para arquivos temporários.
boolean exists() Retorna verdadeiro se existir um arquivo com o mesmo nome no disco rígido.
String getAbsolutePath() Retorna o caminho completo do arquivo com todos os seus subdiretórios.
String getCanonicalPath() Retorna o caminho do arquivo canônico.
Por exemplo, converte o caminho «c:/dir/dir2/../a.txt» para «c:/dir/a.txt»
String[] list() Retorna um array dos nomes dos arquivos contidos no diretório representado pelo objeto atual.
File[] listFiles() Retorna um array de arquivos contidos no diretório representado pelo objeto File atual.
long getTotalSpace() Retorna a quantidade de espaço total (número de bytes) no disco no qual o arquivo está localizado.
long getFreeSpace() Retorna a quantidade de espaço livre (número de bytes) no disco no qual o arquivo está localizado.
boolean renameTo(File) Renomeia o arquivo, ou seja, o conteúdo do arquivo recebe um novo nome. Em outras palavras, você pode renomear o arquivo «c:/dir/a.txt» para «d:/out/text/b.doc».
String getName() Retorna apenas o nome do arquivo sem o caminho.
String getParent() Retorna apenas o caminho (diretório) para o arquivo atual, sem o nome propriamente dito.
Path toPath() Retorna um objeto Path que corresponde ao objeto File atual.

"Uau! Não é uma lista muito pequena, hein? E parece que você pode fazer bastante com ela: criar e excluir arquivos, renomeá-los,..."

"Então, para obter o diretório do arquivo atual, preciso chamar getParent()?"

"Sim, mas ela retorna uma String — o caminho do arquivo — não um objeto File. Na verdade, a classe File duplica quase todos os seus métodos: uma versão retorna uma String, a outra — um objeto File. Confira:"

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Se você tiver uma String com o caminho do arquivo e precisar de um objeto File , use o construtor. Se a situação for inversa (você tem um objeto File , mas precisa de uma String), use getAbsolutePath (). Por exemplo:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"Entendi."

"Ótimo. Então aqui está uma pequena tarefa para você: mostre os nomes de todos os arquivos localizados no mesmo diretório do arquivo atual."

"Nada poderia ser mais fácil. Aqui, veja:"

Código
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Hmm. Correto."

"Mas é um pouco confuso que a mesma classe – File - seja usada tanto para o arquivo quanto para o diretório. Isso não parece muito lógico para mim."

"Funcionou assim por razões históricas. Um diretório costumava ser um arquivo especial 'vazio' no disco. Claro, agora muita coisa mudou, mas não tudo. Isso é tudo que tenho hoje."

"Obrigado pela lição interessante, Bilaabo."