Interfaz de ruta
1. La ruta representa una secuencia de nombres de directorio, seguido de un nombre de archivo. Cuando el primer componente en la ruta es el componente raíz, es la ruta absoluta, como / o c: /, y se puede acceder al componente raíz depende del sistema de archivos;
2. La ruta que comienza con el componente de la raíz es una ruta absoluta, de lo contrario es una ruta relativa;
3. Las rutas estáticas. El método de get acepta una o más cadenas, y las cadenas están conectadas automáticamente mediante el separador de ruta del sistema de archivos predeterminado (UNIX es /, Windows Is /), que resuelve el problema de la plataforma cruzada. Luego analice los resultados conectados. Si no es una ruta legal, se lanzará una excepción InvalidPathException, de lo contrario se devolverá un objeto de ruta;
// Suponga que es la ruta del sistema de archivos UNIX absolute = paths.get ("/home", "cat"); // Absolute Rath ruta relativa = pahts.get ("ixenos", "config", "user.properties"); // ruta relativa4. Obtenga el objeto de ruta de la ruta de cadena
Get también puede obtener una ruta completa (es decir, una sola cadena compuesta de múltiples componentes), por ejemplo, lea la ruta desde un archivo de configuración:
String baseIR = Properties.getProperty ("base.dir"); // se puede obtener/opt/ixenos o c:/programas/archivos de programa/ixenos rath basepath = paths.get (basada);5. Combinando o analizando caminos
1) Llamar a P.Resolve (q) devolverá una ruta de acuerdo con las siguientes reglas: si Q es una ruta absoluta, return Q, de lo contrario, la ruta adjunta devolverá P/Q o P/Q
Path WorkRelative = Paths.get ("Work"); Path WorkPath = BasePath.resolve (WorkRelative); // Resolve también puede aceptar parámetros de cadena ruta de trabajo = basepath.resolve ("trabajo");2) Llamar a P.Resolvhing ("Q") resolverá la ruta principal de la ruta especificada P y generará la ruta de hermanos O/Q
Ruta temppath = workPath.resolvesibling ("temp"); / * Si Workpath es/opt/ixenos/work, entonces/opt/ixenos/tempe se creará */3) Llamar a P.relativize (r) generará una ruta redundante q. El análisis Q generará una ruta relativa r. Al final, R no contiene la ruta de intersección con p.
/* patha is/home/misty pathb is/home/ixenos/config Now PathA ha relativizado Pathb, que generará una ruta redundante*/Path PathC = patha.relativize (Pathb); // En este momento, PATHC es ../ixenos/config/* El método de normalización eliminará la parte redundante*/ruta pathd = pathc.Normaly (); // Pathd is/ixenos/config
4) TOABSOLUTEPATH producirá la ruta absoluta de la ruta dada, comenzando desde el componente raíz
5) La clase de ruta también tiene algunos métodos útiles para desconectar y combinar rutas, como GetParent, GetFileName, Getroot // Obtener el directorio raíz
6) Rath tiene un método de tofile para tratar las clases de archivos heredados, y la clase de archivo también tiene un método Topath
Clase de herramientas de archivos
1. Lea y escriba archivos
Firma del método:
Escritura de ruta estática (ruta de ruta, byte [] bytes, opciones de openOption ...)
Write static ruta (ruta ruta, iterable <? extiende charshence> líneas, openOption ... opciones)
Aquí están solo los métodos utilizados a continuación. Para obtener más métodos, consulte la documentación de la API ...
Entre ellos, OpenOption es una interfaz NIO, StandardOpenOption es su clase de implementación de enumeración. Consulte la documentación de la API para cada función de instancia de enumeración.
/* El método simple proporcionado por los archivos es adecuado para procesar archivos de texto de longitud media. Si el archivo que se procesará es grande o binario, entonces aún debe usar la transmisión IO Classic IO*/// lee todo el contenido del archivo en el byte matriz byte [] bytes = files.readallbytes (ruta); // Pase al objeto de ruta // Después de eso, puede construir la cadena de acuerdo con el conjunto de caracteres String String Content = new String (bytes, charset); // También puede leerla directamente como una secuencia de línea en list <string> líneas = files.readallLines (path, charset); // en contrario, también puede escribir una cadena en el archivo, que debe anular fils.write (rath.getbytes (charset); // pausa byte [] // Agregar contenido, determine las funciones de agregar como ADD basadas en los parámetros files.write (Path, Content.getBytes (Charset), StandardOpenOption.append); // Pausa el objeto de enumeración y enciende el conmutador de append // escribe una lista de colecciones de una cadena de línea en el archivo file.write (ruta, líneas);
2. Copiar, cortar, eliminar
Firma del método:
Copia de ruta estática (fuente de ruta, destino de ruta, copia ... opciones)
Move de ruta estática (fuente de ruta, destino de ruta, copia ... opciones)
Eliminar vecina estática (ruta ruta) // Si la ruta no existe, se lanzará una excepción. Es mejor llamar al siguiente en este momento
Deleteifexistas booleanos estáticos (ruta de camino)
Aquí están solo los métodos utilizados a continuación. Para obtener más métodos, consulte la documentación de la API ...
Entre ellos, CopyOption es una interfaz NIO, StandardCopyOption es su clase de implementación de enumeración. Consulte la documentación de la API para cada función de instancia de enumeración.
Hay un Atomic_Move que se puede completar para garantizar que las operaciones atómicas se completen con éxito o el archivo fuente se mantenga en su posición original.
// Copiar files.copy (fromPath, topath); // corta files.move (fromPath, topath);/* Si Topath ya existe, la operación falla. Si desea sobrescribir, debe pasar en el parámetro reemplazar_existing. También copie los atributos del archivo, pase en copy_attributes*/files.copy (FromPath, Topath, StandardCopyOption.replace_Existing, StandardCopyOption.Copy_Attributes);
3. Crear archivos y directorios
// Crear un nuevo directorio, excepto el último componente, los otros deben ser los archivos existentes. CreateDirectory (ruta); // Cree el directorio intermedio en la ruta, que puede crear los archivos de componentes intermedios inexistentes. Si ya existe, se lanzará una excepción para verificar la existencia del archivo. Por lo tanto, la operación de creación de archivos no se puede realizar en el proceso*/files.createfile (ruta); // Agregar el sufijo pre//para crear un archivo temporal o una ruta de directorio temporal newpath = files.createTempfile (dir, prefix, sufix); path neowpath = files.createTempDirectory (prefix);
4. Obtenga información del archivo
omitido, mire la documentación de la API para obtener más detalles, o CoreJava Page51
5. iterar los archivos en el directorio
La clase de archivo anterior tiene dos métodos para obtener una matriz de cadenas compuesta de todos los archivos en el directorio, string [] list () y string [] list (filtro de infilter), pero cuando el directorio contiene una gran cantidad de archivos, el rendimiento de estos dos métodos será muy bajo.
Análisis de causa:
1. // Lista de clases de archivos Todos los archivos Public String [] list () {SecurityManager Security = System.getSecurityManager (); // Los permisos del sistema de archivos get if (Security! = Null) {Security.Checkread (ruta); } if (isInvalid ()) {return null; } return fs.list (esto); // La llamada subyacente a la lista del sistema de archivos} // la lista de la clase de resumen del sistema de archivos // Los permisos del sistema de archivos definen si (seguridad! = Null) {Security.eckread (ruta); } if (isInvalid ()) {return null; } return fs.list (esto); // La llamada subyacente a la lista de sistemas de archivos} // la lista de la clase de resumen del sistema de archivos // la clase de archivos define fs es un sistema de archivos final estático privado que se genera estáticamente por defaultilyfilesystem fs = defaultFilesystem.getFilesSystem (); // SO SOMBRE una mirada a la clase predeterminada de la clase de sistema y descubriendo que es generar un Winntfilesystem Classystem FIELSYSTEM { Objeto del sistema de archivos para la plataforma Windows. */ public static Filesystem getFilesystem () {return new WinNTFilesystem (); }} // La clase WinntFilesystem hereda de la clase de resumen del sistema de archivos. Aquí observamos principalmente su método de lista (archivo de archivo) @OverridePublic Public String [] list (archivo f);/*Podemos ver que este es un método nativo, que muestra que la operación de la lista está controlada por el sistema de archivos del sistema operativo. Cuando el directorio contiene una gran cantidad de archivos, el rendimiento de este método será muy bajo. Por lo tanto, para reemplazarlo, la clase de archivos de NIO diseñó NewDirectoryStream (rath dir) y su método sobrecargado, que generará un objeto Iterer (se puede iterar foreach) *//// ~ 2. // llamando a la cadena pública de filtro [] list (filtro de nombre de nombre) {// use los nombres de las cadenas de llamada de interfaz [] = list (); // Llamar lista todo if ((names == null) || (filtre == null)) {devuelve nombres; } List <String> V = New ArrayList <> (); for (int i = 0; i <names.length; i ++) {if (filter.accept (this, nombres [i])) {// devolución de llamada el método de aceptación del objeto FileNameFileter V.Add (nombres [i]); }} return v.toarray (nueva cadena [v.size ()]); }En este momento, viene la alta tecnología: los archivos obtienen transmisiones de directorio iterables,
Pase en una ruta de directorio, atraviese el directorio de descendientes y devuelva una secuencia de ruta de directorio. ¡Tenga en cuenta que todas las rutas involucradas aquí son directorios en lugar de archivos!
Por lo tanto, la clase de archivos diseña newDirectoryStream (rath dir) y su método sobrecargado, que generará un objeto iterable (se puede usar para cada
Iterar a través del directorio para obtener una colección iterable de archivos de descendientes
staticDirectoryStream<Path> | newDirectoryStream(Path dir) abre un directorio, devolviendo un DirectoryStream para iterar sobre todas las entradas en el directorio. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) abre un directorio, devolviendo un DirectoryStream para iterar sobre las entradas en el directorio. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
Devolver una transmisión de directorio puede considerarse como una colección que almacena todas las rutas que implementan iterables.
Por lo tanto, los iteradores o foreach iteratan, pero al usar iteradores, tenga cuidado de no invocar a otro iterador:
Si bien DirectoryStream se extiende ITerable, no es un ITerable de uso general, ya que es compatible con un solo iterador; Invocar el método de iterador para obtener un segundo o posterior iterador lanza ilegalstateException.
Ejemplo:
Pry (DirectoryStream <Path> Entries = files.newDirectoryStream (dir)) {for (Entrada de ruta: entradas) {...}}Puede pasar en los parámetros de Glob, es decir, usar el modo de global para filtrar archivos (en lugar de la lista (filtro de filtro de archivo)):
newDirectoryStream (ruta dir, string glob) Tenga en cuenta que es el tipo de cadena
Prueba (DirectoryStream <Path> Entries = files.newDirectoryStream (dir, "*.java")) // {...}modo global
El llamado patrón del globo se refiere a la expresión regular simplificada utilizada por la carcasa.
1. Asterisk* coincide con 0 o más caracteres en el componente de ruta; por ejemplo *.Java coincide con todos los archivos Java en el directorio actual
2. Dos asteriscos ** coinciden con 0 o más caracteres a través de los límites del directorio; Por ejemplo, **. Java coincide con los archivos Java en todos los subdirectorios
3. El signo de interrogación (?) Solo coincide con un carácter; Por ejemplo, Java coincide con los cuatro caracteres de los archivos Java, excluyendo extensiones; usar ? porque * es un personaje comodín y no especifica el número
4. [...] Para que coincida con un conjunto de caracteres, puede usar la conexión [0-9] y el carácter inverso [! 0-9]; Por ejemplo, prueba [0-9A-F] .Java para que coincida con TestX.Java, suponiendo que X sea un número hexadecimal, [0-9a-f] es coincidir con un solo carácter como un número hexadecimal, como B (hexadecimal es insensible en caso)
Si usa los soportes de Dash In Square para separar dos caracteres, significa que todos aquellos dentro del rango de estos dos caracteres pueden coincidir (por ejemplo, [0-9] significa coincidir con los números de 0 a 9).
5. {...} coincidir con una de las múltiples opciones opcionales separadas por comas; por ejemplo *. {java, class} coincidir con todos los archivos Java y archivos de clase
6./ Escapar caracteres en cualquiera de los patrones anteriores; por ejemplo */** coincide con los archivos con nombres de archivos en todos los subdirectorios con *, aquí está ** Escape, precedido por coincidir con 0 o más caracteres
El siguiente es el modelo global resumido por los internautas:
| Modo global | describir |
|---|---|
| *.TXT | Haga coincidir todos los archivos con la extensión .txt |
| *. {html, htm} | Haga coincidir todos los archivos con extensiones de .html o .htm. {} se usa para el modo de grupo, que está separado por comas |
| ?.TXT | Haga coincidir cualquier personaje único como nombre de archivo y extensión .txt |
| . | Haga coincidir todos los archivos con extensiones |
| C:/usuarios/* | Haga coincidir todos los archivos en el directorio de usuarios de la unidad C. Back -stass "/" se usa para escapar de los personajes inmediatamente siguientes |
| /hogar/** | Haga coincidir los directorios y archivos de todos /inicio en subdirectorios en la plataforma Unix. ** Se utiliza para que coincida con el directorio actual y todos sus subdirectorios |
| [xyz] .txt | Haga coincidir con todos los caracteres individuales como nombres de archivo, y un solo personaje contiene solo uno de "x" o "y" o "z", y tiene una extensión de .txt. Los soportes cuadrados [] se utilizan para especificar una colección |
| [AC] .txt | Haga coincidir con todos los caracteres individuales como nombres de archivo, y un solo personaje contiene solo uno de los tres tipos de "A" o "B" o "C", y tiene una extensión de .txt. El signo menos "-" se usa para especificar un rango y solo se puede usar en soportes cuadrados [] |
| [! A] .txt | Haga coincidir con todos los caracteres individuales como nombres de archivo, y un solo carácter no puede contener la letra "A" y la extensión es .txt. Marca de exclamación "!" se usa para negar |
¿No es bueno iterar a través de todas las colecciones de archivos de descendientes en un determinado directorio? Vamos, atravesemos directamente a todos los descendientes (incluidos directorios y archivos) de un directorio.
Podemos llamar al método walkfiletree de la clase de archivos y pasar en un objeto de tipo de interfaz de ovisitor de archivo (hay más métodos esperando que descubra en la API ...)
/*Pase un objeto anónimo de la subclase de FileVisitor*/files.walkFiletree (Dir, new SimpleFeLeVisitor <Rath> () {// WalkFileTree Callback Este método se usa para atravesar todos los descendientes públicos públicos Public FilEvisUtlT (VisitFile (Path Path, BasicFileAtTributes Attrs) lanza IOException {Si (Atracts. al código de negocios, que no tiene nada que ver con el propósito de walkfiletree (atravesando a todos los miembros de los descendientes) System.out.println (ruta);Resumímoslo,
Archivos.newdirectorystream (rath dir) Devuelve una colección iterable de archivos descendientes después de recorrer;
Files.walkfiletree (rath dir, fileVisitor fv) es un proceso de atravesar los directorios y archivos de descendientes;
Sistema de archivos zip
Como sabemos anteriormente, la clase de rutas buscará rutas en el sistema de archivos predeterminado, es decir, archivos en el disco local del usuario.
De hecho, también podemos tener otros sistemas de archivos, como los sistemas de archivos ZIP.
/*Suponga que ZIPNAME es el nombre de un archivo zip*/filesystem fs = filessystems.newfilesystem (ratts.get (zipname), null);
El código anterior creará un sistema de archivos basado en ZipName que contiene todos los archivos en el documento ZIP.
1) Si conoce el nombre del archivo (tipo de cadena), es fácil copiar el archivo de este documento zip:
Files.copy (fs.getPath (nombre de archivo), TargetPath);
P: Fs.GetPath usa el sistema de archivos ZIP para GetPath, entonces, ¿se puede llamar al sistema de archivos predeterminado?
A: Sí. Hay un método estático getDefault () en la clase del sistema de archivos, que devuelve un objeto de sistema de archivos predeterminado, que también se puede obtener con el nombre del archivo GetPath.
Para fines específicos, si GetPath (nombre de cadena) está atravesado o acceso aleatorio, vaya a ver la implementación del código fuente cuando tenga tiempo.
2) Para enumerar todos los archivos en el documento zip, también puede usar WalkFiletree para atravesar el árbol de archivos
FileSystem fs = filesystems.newfilesystem (raths.get (nombre de archivo), null); // walkfileTree debe pasar en una ruta de directorio para ser atravesado, y un archivo de archivos de objetos de archivos.WalkFileTree (Fs.getPath ("/"), NewsImplePleFileVisitor <Stath> () {Public FileVisitResItResMult (File, BASETTROTTRUTTRUTUTTRUTTRETTRETTRESTURTUTURTURTURTURTURTURTURTURTURTURTURTURTURTURTURTURTURTURTURTURTUTULTURES) Lanza excepción {System.out.println (archivo);El ejemplo anterior de la interfaz Java Nio Path y la clase de archivos que funcionan juntos es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.