"Oh, Rishi! Oi!"

"Oi, amigo! Como vai a vida?"

"Ótimo. Bilaabo acabou de me contar um monte de coisas interessantes sobre o File e como trabalhar com ele."

"Acontece que acho que tenho algo a acrescentar sobre esse tópico."

"Sério? Então eu sou todo ouvidos."

"Ok, escute. Java está em constante evolução. Seus desenvolvedores estão constantemente procurando novas maneiras de fazer coisas diferentes com mais eficiência. No Java 7, eles adicionaram uma alternativa à classe File."

Arquivos, Caminho - 1

"Alternativa?"

"Sim. Eles pegaram a classe File como base, adicionaram algumas coisas novas, renomearam os métodos e também dividiram em dois. Portanto, agora há duas novas classes: Path e FilesPath é na verdade o novo análogo do File e File é uma classe utilitária (análoga às classes Arrays e Collections). Todos os métodos estáticos da classe File vão para lá. Fazer dessa forma é 'mais correto' em termos de OOP."

"Bem, se for em termos de OOP, tudo bem. Então, o que mudou?"

"Primeiro, eles decidiram não reproduzir os métodos que retornavam  objetos String  e File . Na classe Path  , todos os métodos retornam um Path .

"Segundo, eles moveram muitos métodos utilitários estáticos para a classe Files ."

"Terceiro, tornou-se mais conveniente trabalhar com caminhos relativos."

"Aqui está uma lista dos métodos:"

Métodos da classe Path Descrição
boolean isAbsolute() Retorna verdadeiro se o caminho for absoluto.
Path getRoot() Retorna a raiz do caminho atual, ou seja, o diretório superior.
Path getFileName() Retorna o nome do arquivo do caminho atual.
Path getParent() Retorna o diretório do caminho atual.
boolean startsWith(Path other) Verifica se o caminho atual começa com o caminho passado.
boolean endsWith(Path other) Verifica se o caminho atual termina com o caminho passado.
Path normalize() Normaliza o caminho atual. Por exemplo, converte «c:/dir/dir2/../a.txt» em «c:/dir/a.txt»
Path relativize(Path other) Calcula o caminho relativo de dois caminhos, ou seja, «a diferença entre os caminhos»
Path resolve(String other) Resolve um caminho absoluto usando os caminhos atual e relativo.
URI toUri() Retorna o URI se o caminho/arquivo atual.
Path toAbsolutePath() Converte o caminho em um caminho absoluto se for relativo.
File toFile() Retorna um objeto File que corresponde ao objeto Path atual.

"E o caminho atual - o que é isso?"

"Este é o caminho que foi passado para o construtor do objeto Path cujos métodos estão sendo chamados."

"OK. Então, quais métodos a classe Files possui?"

"Você está com pressa para chegar a algum lugar? Vou lhe dizer agora mesmo. Aqui estão os métodos mais importantes:"

Métodos da classe Files Descrição
Path createFile(…) Cria um arquivo no disco.
Path createDirectory(…) Cria um diretório.
Path createDirectories(…) Cria um diretório e todos os seus subdiretórios.
Path createTempFile(…) Cria um arquivo temporário.
Path createTempDirectory(…) Cria um diretório temporário.
void delete(Path path) Exclui um arquivo.
Path copy(Path source, Path target,…) Copia um arquivo.
Path move(Path source, Path target,…) Move um arquivo.
boolean isSameFile(Path, Path) Compara dois arquivos.
boolean isDirectory(Path) O caminho é um diretório?
boolean isRegularFile(Path) O caminho é um arquivo?
long size(Path) Retorna o tamanho do arquivo.
boolean exists(Path) Existe um objeto com o mesmo nome?
boolean notExists(Path) Um objeto com o mesmo nome não existe?
long copy(InputStream, OutputStream) Copia bytes do InputStream para o OutputStream.
long copy(Path, OutputStream) Copia todos os bytes do Path para o OutputStream.
long copy(InputStream, Path) Copia todos os bytes do InputStream para o Path.
byte[] read(InputStream, int initialSize) Lê uma matriz de bytes do InputStream.
byte[] readAllBytes(Path path) Lê todos os bytes do InputStream.
List<String> readAllLines(Path path,..) Lê o arquivo de texto e retorna uma lista de strings.
Path write(Path path, byte[] bytes,…) Grava uma matriz de bytes em um arquivo.

"Que interessante! Tantas funções bacanas, e tudo no mesmo lugar."

"Bem, olhe. Suponha que você queira baixar um arquivo da Internet e depois enviá-lo para alguém. Para fazer isso, é muito conveniente criar um arquivo temporário no disco e salvar os dados lidos nele."

"É difícil baixar um arquivo da Internet?"

"É muito simples. Veja este exemplo:"

Código
URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
InputStream inputStream = url.openStream();

Path tempFile = Files.createTempFile("temp-",".tmp");
Files.copy(inputStream, tempFile);

"E é isso?"

"Sim, o que você esperava ver? Existem apenas 4 linhas."

" Linha 1.  Cria um objeto URL, para o qual o URL do arquivo de imagem é passado.

" Linha 2.  Um fluxo para leitura de um arquivo (InputStream) é aberto no objeto url.

" Linha 3.  O createTempFilemétodo é usado para criar um arquivo temporário.

" Linha 4.  O método Files.copy copia dados de  inputStream para tempFile. É isso."

"Engenhoso!"

"Ótimo. Fico feliz que você tenha gostado. Acho que você pode descobrir o resto dos métodos sozinho. E vou pedir a Diego para lhe dar várias tarefas sobre eles."

"A propósito, aqui está um bom link para este material"