Saltar al contenido

¿Dónde usar el método resolve() y relativize() de la clase java.nio.file.Path?

Si te encuentras con algo que no entiendes puedes dejarlo en la sección de comentarios y te responderemos lo más rápido posible.

Solución:

No puedo entender cómo funcionan los métodos resolve() y relativize().

Path resolve(Path) resuelve el camino dado contra this sendero.
Path relativize(Path) construye una ruta relativa de la ruta dada contra this sendero .
Estas son operaciones inversas.


Resolución de ruta (otra ruta)

En el caso de uso general de resolve()quieres devolver un nuevo Path objeto donde se unirá a este Path objetar a la Path parámetro que es relativo Path como :

Path p1 = Paths.get("/Users/jack");
Path p2 = Paths.get("text1.txt");
Path result1 = p1.resolve(p2);

Aquí result1 será el camino de unión de p1 y p2es decir : /Users/jack/text1.txt.

En su ejemplo, el parámetro pasado al método no es relativo Path pero un absoluto:

Path p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result1 = p1.resolve(p2); 

No tiene sentido “añadir” un Path a otro si el segundo es un absoluto Path.
Entonces el javadoc considera que en este caso el parámetro se devuelve como resultado de resolve() :

Si el otro parámetro es una ruta absoluta, este método devuelve trivialmente otro.

Ruta relativizar (Ruta otra)

El documento dice más específicamente:

Este método intenta construir una ruta relativa que cuando se resuelve contra this ruta, produce una ruta que localiza el mismo archivo que la ruta dada.

Significa que el devuelto Path es la ruta relativa de la Path parámetro relativo a thisPath.

Por ejemplo, si this camino es "/a/b" y el camino dado es "/a/b/c/d" entonces la ruta relativa resultante sería "c/d".

Lo comprobaremos con tu ejemplo:

Path p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result2 = p1.relativize(p2);   
// result2= ../../text2.txt

Él ../../text2.txt La ruta se espera como resultado de la ruta relativa producida ( ../../text2.txt) resuelto en contra this sendero (/Users/jack/Documents/text1.txt) genera una ruta que ubica el mismo archivo que la ruta dada (/Users/jack/text2.txt) :

Paths.of("/Users/jack/Documents/text1.txt").resolve("../../text2.txt")

returns -> /Users/jack/text2.txt

resolve(): Une dos caminos.

relativize (): construye una ruta desde una ubicación en el sistema de archivos a otra ubicación.

Explicación de salida:

result1: /Users/jack/text2.txt: porque pasaste en un camino absoluto, resolve() devuelve lo pasado en la ruta como si fuera una ruta absoluta.

result2: ../../text2.txt: para llegar a /Users/jack/text2.txt desde /Users/jack/Documents/text1.txt" debe subir dos niveles y luego seleccionar el archivo `text2.txt.

Estos son fragmentos de código de mi base de código que lo ayudan a comprender el uso del método resolve()

private File initUsersText() throws Exception

    Path dir = testdir.getPath().toRealPath();
    FS.ensureDirExists(dir.toFile());
    File users = dir.resolve("users.txt").toFile();

    writeUser( users );
    return users;



private File initUsersText() throws Exception

    Path dir = testdir.getPath().toRealPath();
    FS.ensureDirExists(dir.toFile());
    File users = dir.resolve("users.txt").toFile();

    writeUser( users );
    return users;

Y estos son los ejemplos del uso de relativize()

public ScopePath pathToClassName(Path file) 
    if (!isValidClass(file))
        return null;

    Path relativePath = root.relativize(root.resolve(file));
    String withoutExtension = removeExtension(relativePath.toString());
    return new ScopePath(withoutExtension.replace(File.separator, "."));



private String getRelativePath(Path p) 
    String relativePath = packageDir.relativize(p)
            .toString();

    if (File.separator.equals("\")) 
        relativePath = relativePath.replace("\", "/");
    

    return relativePath;

Si sostienes alguna incertidumbre y disposición de prosperar nuestro noticia eres capaz de añadir una interpretación y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *