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 p2
es 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 this
Path
.
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.