Interface do caminho
1. O caminho representa uma sequência de nomes de diretórios, seguida por um nome de arquivo. Quando o primeiro componente no caminho é o componente raiz, é o caminho absoluto, como / ou c: /, e o componente raiz permitido ser acessado depende do sistema de arquivos;
2. O caminho que começa com o componente raiz é um caminho absoluto, caso contrário, é um caminho relativo;
3. O método estático. Em seguida, analise os resultados conectados. Se não for um caminho legal, uma exceção inválida da PathException será lançada, caso contrário, um objeto de caminho será retornado;
// Suponha que seja o caminho do sistema de arquivos UNIX absoluto = paths.get ("/home", "gat"); // Caminho absoluto do caminho relativo = pahts.get ("ixenos", "config", "user.properties"); // caminho relativo4. Obtenha o objeto de caminho do caminho da string
O GET também pode obter um caminho inteiro (ou seja, uma única sequência composta por vários componentes), por exemplo, leia o caminho de um arquivo de configuração:
String baseado = Properties.getProperty ("base.dir"); // pode ser obtido/opt/ixenos ou C:/Arquivos de programas/ixenos path Basepath = paths.get (baseado);5. Combinando ou analisando caminhos
1) Chamando P.Resolve (Q) retornará um caminho de acordo com as seguintes regras: Se q for um caminho absoluto, retornará q, caso contrário, o caminho anexado retornará P/Q ou P/Q
Path WorkRelative = Paths.get ("Work"); Path WorkPath = BasEpath.Resolve (Workrelative); // Resolve também pode aceitar parâmetros de string path workpath = basepath.resolve ("trabalho");2) Chamando P.Resolvesibling ("Q") resolverá o caminho pai do caminho especificado P e gerará o caminho de irmão o/q
Caminho temppath = workpath.resolvesibling ("temp"); / * Se o WorkPath for/opt/ixenos/work, então/opt/ixenos/temp será criado */3) Chamando P.Relative (R) gerará um caminho redundante q. A análise q gerará um caminho relativo r. No final, R não contém o caminho de interseção com p.
/* Patha é/Home/Misty PathB Is/Home/ixenos/Config Now Patha relativou o PATHB, que gerará um caminho redundante*/pathccc = patha.Relative (PATHB); // Neste momento, o PATHC é ../ixenos/config/*** Normalize o método removerá a parte redundante*/pathdd = pathc.normalize (); // pathd is/ixenos/config
4) Toabsolutepath produzirá o caminho absoluto do caminho dado, começando pelo componente raiz
5) A classe Path também possui alguns métodos úteis para desconectar e combinar caminhos, como getParent, getFileName, getroot // obtenha o diretório raiz
6.
Classe de ferramenta de arquivos
1. Leia e escreva arquivos
Assinatura do método:
Escrita de caminho estático (caminho do caminho, byte [] bytes, OpenOption ... opções)
Escrita de caminho estático (caminho do caminho, iterable <? estende as linhas de Charsequence>, OpenOption ... opções)
Aqui estão apenas os métodos usados abaixo. Para mais métodos, consulte a documentação da API ...
Entre eles, o OpenOption é uma interface do NIO, o StandardOpeNoption é sua classe de implementação de enumeração. Verifique a documentação da API para cada função da instância de enumeração.
/* O método simples fornecido pelos arquivos é adequado para processar arquivos de texto de comprimento médio. Se o arquivo a ser processado for grande ou binário, você ainda deverá usar o fluxo clássico de IO*/// leia todo o conteúdo do arquivo no Byte Array Byte [] bytes = files.readallbytes (caminho); // Passa para o objeto Path // depois disso, você pode construir a sequência de acordo com o conjunto de caracteres String Content = new String (bytes, charset); // Você também pode lê -lo diretamente como uma sequência de linha na lista <String> lines = files.readAllLines (Path); // pausa byte [] // Anexe o conteúdo, determine as funções do anexo, como Adicionar com base nos arquivos parâmetros.write (path, content.getbytes (charset), standardopenOption.append); // pause o objeto de enumeração e ligue o switch de apêndice // escreva uma lista de coleções de uma string de linha no arquivo de arquivos.write (caminho, linhas);
2. Copie, corte, exclua
Assinatura do método:
Cópia do caminho estático (fonte do caminho, alvo de caminho, opções de copoption ...)
Move de caminho estático (fonte do caminho, alvo de caminho, opções de copioption ...)
Excluir estático de vazio (caminho do caminho) // Se o caminho não existir, uma exceção será lançada. É melhor ligar para o seguinte neste momento
estático booleano DeleteifeXists (caminho do caminho)
Aqui estão apenas os métodos usados abaixo. Para mais métodos, consulte a documentação da API ...
Entre eles, a CopyOption é uma interface do NIO, a StandardCopyOption é sua classe de implementação de enumeração. Verifique a documentação da API para cada função da instância de enumeração.
Existe um Atomic_move que pode ser preenchido para garantir operações atômicas, o movimento é concluído com sucesso ou o arquivo de origem é mantido em sua posição original.
// copy files.copy (frompath, topath); // Cut Files.move (frompath, topath);/* Se o topath já existir, a operação falha. Se você deseja substituir, precisará passar no parâmetro substituir_existing. Copie também os atributos do arquivo, passe em copy_attributes*/files.copy (frompath, topath, standardcopyOption.replace_existing, padrãocopyOption.copy_attributes);
3. Crie arquivos e diretórios
// Crie um novo diretório, exceto para o último componente, os outros devem ser os arquivos existentes.createDirectory (caminho); // Crie o diretório intermediário no caminho, que pode criar os arquivos de componentes intermediários inexistentes. Se já existir, uma exceção será lançada para verificar a existência do arquivo. Portanto, a operação de criação de arquivos não pode ser realizada no processo*/files.createfile (caminho); // Adicione o pré-/sufixo para criar um arquivo temporário ou um caminho de diretório temporário newpath = files.createTempFile (Dir, prefixo, sufixo); pathath = files.creatEtempdirectory (prefixado);
4. Obtenha informações de arquivo
omitido, veja a documentação da API para obter detalhes, ou Corejava Page51
5. itera sobre arquivos no diretório
A classe de arquivo antigo possui dois métodos para obter uma matriz de string composta por todos os arquivos no diretório, string [] list () e string [] List (filtro FileFilter), mas quando o diretório contém um grande número de arquivos, o desempenho desses dois métodos será muito baixo.
Análise de causa:
1. // Lista da classe de arquivo todos os arquivos public String [] LIST () {SecurityManager Security = System.getSecurityManager (); // Permissões do sistema de arquivos Get if (Security! = NULL) {Security.CheckRead (Path); } if (isInValid ()) {return null; } retorna fs.list (this); // A chamada subjacente para a lista de sistemas de arquivos} // A lista de Classe abstrata do sistema de arquivos // as permissões do sistema de arquivos define if (segurança! = Null) {Security.CheckRead (caminho); } if (isInValid ()) {return null; } retorna fs.list (this); // A chamada subjacente para a lista de sistemas de arquivos} // A lista da classe abstrata do sistema de arquivos // A classe de arquivo define FS é um sistema de arquivos estático privado gerado estaticamente por defaultfilesystem fs = defaultfilesystem.getfilesystem (); //, para que observe o sistema de files de sistema e encontre que é que ele é o que é um para o que é uma olhada no sistema de sistema de sistema e, em vez, para que seja, para que os signos do sistema de base. Retorne o objeto do sistema de arquivos para a plataforma Windows. */ public Static FileSystem getFilesystem () {return new winntFilesystem (); }} // A classe WinntFilesystem herda da classe abstrata do sistema de arquivos. Aqui, observamos principalmente sua lista (arquivo de arquivo) @OverridePublic Native String [] List (arquivo f);/*Podemos ver que este é um método nativo, que mostra que a operação da lista é controlada pelo sistema de arquivos do sistema operacional. Quando o diretório contém um grande número de arquivos, o desempenho desse método será muito baixo. Portanto, para substituí -lo, a classe de arquivos da NIO projetou o NewDirectoryStream (Path Dir) e seu método sobrecarregado, que gerará um objeto iterável (pode ser iterado foreach) */// ~ 2. // Chamando o filtro de volta Public String [] lista (filtro de fileNameFilter) {// use nomes de string de retorno de interface [] = List (); // Lista de chamadas All if ((nomes == null) || (filtro == null)) {retorna nomes; } List <tring> v = new ArrayList <> (); for (int i = 0; i <names.length; i ++) {if (filter.accept (this, nomes [i])) {// retorno de chamada O método de aceitação do objeto FileNameFileter v.add (nomes [i]); }} retorna v.toarray (new string [v.size ()]); }Neste momento, a alta tecnologia vem - os arquivos obtêm fluxos de diretório iterável,
Passe em um caminho de diretório, atravesse o diretório descendente e retorne um fluxo de caminho do diretório. Observe que todos os caminhos envolvidos aqui são diretórios em vez de arquivos!
Portanto, a classe de arquivos projeta o novo e o DirectoryStream (Path Dir) e seu método sobrecarregado, que gerarão um objeto iterável (pode ser usado para alcançar o item)
Itera através do diretório para obter uma coleção iterável de arquivos descendentes
staticDirectoryStream<Path> | newDirectoryStream(Path dir) abre um diretório, retornando um DirectoryStream para iterar sobre todas as entradas no diretório. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) abre um diretório, retornando um DirectoryStream para iterar sobre as entradas no diretório. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
O retorno de um fluxo de diretório pode ser considerado como uma coleção que armazena todos os caminhos que implementam iterable.
Portanto, iteradores ou fore -os iterados, mas ao usar iteradores, tome cuidado para não invocar outro iterador:
Embora o Directorystream se estenda, não é um iterável de uso geral, pois suporta apenas um único iterador; Invocar o método do iterador para obter um segundo ou subsequente iterador lança ilegalStateException.
Exemplo:
Try (DirectoryStream <Path> entradas = files.NewDirectoryStream (dir)) {for (entrada do caminho: entradas) {...}}Você pode passar os parâmetros do GLOB, ou seja, usar o modo glob para filtrar arquivos (em vez de list (filtro FileFilter)):
NewDirectoryStream (Dir, String Glob) Observe que é o tipo de string
Tente (DirectoryStream <Path> entradas = files.NewDirectoryStream (dir, "*.java")) // {...}modo glob
O chamado padrão globo refere-se à expressão regular simplificada usada pelo shell.
1. Asterisk* corresponde a 0 ou mais caracteres no componente do caminho; Por exemplo *.Java corresponde a todos os arquivos Java no diretório atual
2. Dois asteriscos ** correspondem a 0 ou mais caracteres entre os limites do diretório; Por exemplo, **. Java corresponde a arquivos Java em todos os subdiretos
3. O ponto de interrogação (?) Corresponde apenas a um caractere; Por exemplo, ????. Java corresponde a todos os quatro caracteres de arquivos Java, excluindo extensões; usar ? Porque * é um personagem curinga e não especifica o número
4. [...] Para corresponder a um conjunto de caracteres, você pode usar a conexão [0-9] e o caractere inverso [! 0-9]; Por exemplo, teste [0-9a-f] .java para corresponder a testx.java, assumindo que x é um número hexadecimal, [0-9a-f] é para corresponder a um único caractere como um número hexadecimal, como B (hexadecimal é insensível a minúsculas)
Se você usar o Dash entre colchetes para separar dois caracteres, isso significa que todos os que dentro do alcance desses dois caracteres podem ser correspondidos (por exemplo, [0-9] significa corresponder a todos os 0 a 9 números).
5. {...} corresponde a uma das várias opções opcionais separadas por vírgulas; por exemplo *. {java, classe} corresponde a todos os arquivos java e arquivos de classe
6./ Escape caracteres em qualquer um dos padrões acima; Por exemplo, */** corresponde a arquivos com nomes de arquivos em todos os subdiretos com *, aqui está ** Escape, precedido pela correspondência de 0 ou mais caracteres
A seguir, o modelo Glob resumido pelos internautas:
| Modo glob | descrever |
|---|---|
| *.TXT | Combine todos os arquivos com a extensão .txt |
| *. {html, htm} | Combine todos os arquivos com extensões de .html ou .htm. {} é usado para o modo de grupo, que é separado por vírgulas |
| ?.TXT | Combine qualquer caractere como nome e extensão do arquivo .txt |
| . | Combine todos os arquivos com extensões |
| C:/usuários/* | Combine todos os arquivos no diretório de usuários da unidade C. Backslash "/" é usado para escapar dos caracteres imediatamente seguintes |
| /lar/** | Combine todos os diretórios e arquivos domésticos em subdiretos na plataforma Unix. ** usado para corresponder ao diretório atual e a todas as suas subdiretas |
| [xyz] .txt | Combine todos os caracteres únicos como nomes de arquivos, e um único caractere contém apenas um de "x" ou "y" ou "z" e tem uma extensão de .txt. Suportes quadrados [] são usados para especificar uma coleção |
| [AC] .txt | Combine todos os caracteres únicos como nomes de arquivos, e um único caractere contém apenas um dos três tipos de "A" ou "B" ou "C" e possui uma extensão de .txt. O sinal de menos "-" é usado para especificar um intervalo e só pode ser usado entre colchetes [] |
| [! A] .txt | Combine todos os caracteres únicos como nomes de arquivos, e um único caractere não pode conter a letra "A" e a extensão é .txt. Marca de exclamação "!" é usado para negar |
Não é bom iterar em todas as coleções de arquivos descendentes em um determinado diretório? Vamos lá, vamos atravessar diretamente todos os descendentes (incluindo diretórios e arquivos) de um diretório.
Podemos chamar o método WalkFiletree da classe de arquivos e passar em um objeto do tipo de interface FileVisitor (há mais métodos esperando você descobrir na API ...)
/*Pass an anonymous object of the FileVisitor subclass*/Files.walkFileTree(dir, new SimpleFileVisitor<Path>() { //walkFileTree callback This method is used to traverse all descendants public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if(attrs.isDirectory()) //Customized selection belongs to Código de negócios, que não tem nada a ver com o objetivo de WalkFiletree (atravessando todos os membros descendentes ).Println (Path);Vamos resumir,
Files.NewDirectorystream (Path Dir) retorna uma coleção iterável de arquivos descendentes após o Traversal;
Files.walkfiletree (Path Dir, FileVisitor FV) é um processo de atravessar os diretórios e arquivos de descendentes;
Sistema de arquivo zip
Como sabemos acima, a classe Paths procurará caminhos no sistema de arquivos padrão, ou seja, arquivos no disco local do usuário.
De fato, também podemos ter outros sistemas de arquivos, como sistemas de arquivo zip.
/*Suponha que o ZipName seja o nome de um arquivo zip*/FileSystem fs = filesystems.newfilesystem (paths.get (zipname), null);
O código acima criará um sistema de arquivos baseado em ZipName que contém todos os arquivos no documento ZIP.
1) Se você conhece o nome do arquivo (tipo string), é fácil copiar o arquivo deste documento ZIP:
Files.copy (fs.getPath (nome do arquivo), TargetPath);
P: O FS.GetPath usa o sistema de arquivo zip para obter o GetPath, então o sistema de arquivos padrão pode ser chamado?
A: Sim. Existe um método estático getDefault () na classe FileSystem, que retorna um objeto de sistema de arquivos padrão, que também pode ser obtido pelo nome do arquivo getPath.
Para fins específicos, se o getPath (nome da string) é percorrido ou acessar aleatório, vá para ver a implementação do código -fonte quando tiver tempo.
2) Para listar todos os arquivos no documento ZIP, você também pode usar o WalkFiletree para atravessar a árvore de arquivos
Filesystem fs = filesystems.newfilesystem (paths.get (nome do arquivo), nulo); // walkfiletree precisa passar em um caminho de diretório a ser atravessado, e um arquivo de objeto FileVisitor.walkFiletree (FILFS.GetPath ("/"), newsImpleFileVisitor <tathUsTee, Pathutree (FILFSTHPATHIs ("/"/"), NewsImpleFileVisitor <tath> () {) Exceção de lança {System.out.println (arquivo);O exemplo acima da interface Java Nio Path e da classe de arquivos trabalhando juntos é todo o conteúdo que eu compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.