En Python
puedo unir dos caminos con os.path.join
:
os.path.join("foo", "bar") # => "foo/bar"
Estoy tratando de achive la misma en Java, sin preocuparse de si la OS
es Unix
, Solaris
o Windows
:
public static void main(String[] args) {
Path currentRelativePath = Paths.get("");
String current_dir = currentRelativePath.toAbsolutePath().toString();
String filename = "data/foo.txt";
Path filepath = currentRelativePath.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
}
Esperaba que Path.resolve( )
se uniera a mi directorio actual /home/user/test
con data/foo.txt
making /home/user/test/data/foo.txt
. ¿Qué me estoy equivocando?
filepath.toString()
new File(parent, child)
Respuestas:
Aunque la solución original para obtener el directorio actual usando
empty String
works. Pero se recomienda utilizar lauser.dir
propiedad para el directorio actual yuser.home
para el directorio de inicio.salida:
De la documentación de la clase Java Path :
Por que
Paths.get("").toAbsolutePath()
funcionaCuando se pasa una cadena vacía al
Paths.get("")
, elPath
objeto devuelto contiene una ruta vacía. Pero cuando llamamosPath.toAbsolutePath()
, verifica si la longitud de la ruta es mayor que cero; de lo contrario, usa lauser.dir
propiedad del sistema y devuelve la ruta actual.Aquí está el código para la implementación del sistema de archivos Unix: UnixPath.toAbsolutePath ()
Básicamente, debe crear la
Path
instancia nuevamente una vez que resuelva la ruta del directorio actual.También sugeriría usar
File.separatorChar
código independiente de la plataforma.Salida:
fuente
separatorChar
es inferior a alguna "abstracción de nivel superior", algo que se parece aPathBuilder(currentRelativePath).append("data").append("foo.txt")
Paths#get(String first, String... more)
estados,Para obtener el directorio de usuarios actual, simplemente puede usar
System.getProperty("user.dir")
.Además, el
get
método utiliza el argumento de longitud variable deString
, que se utilizará para proporcionar cadenas de ruta posteriores. Por lo tanto, para crearPath
por/test/inside/abc.txt
lo que tienes que usarlo de una manera siguiente,fuente
No es un método específico.
Si usa java 8 o mejor, tiene 2 opciones:
a) Utilice java.util.StringJoiner
b) Utilizar
String.join(File.pathSeparator, "path1", "path2");
Si usa java 7 o versiones anteriores, puede usar la biblioteca commons-lang de apache commons. La clase StringUtils tiene un método para unir cadenas usando un separador.
C)
StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
Una nota al margen: puede usar el separador de rutas de Linux "/" para Windows (solo recuerde que las rutas absolutas son algo como "/ C: / mydir1 / mydir2". Usar siempre "/" es muy útil si usa protocolos como file: //
fuente
/home/user/test:foo.txt
File.separator
trabajó para mí en lugar deFile.pathSeparator
La forma más básica es:
Nunca deberías escribir
Paths.get("")
. Me sorprende que funcione en absoluto. Si desea hacer referencia al directorio actual de forma explícita, utilicePaths.get(System.getProperty("user.dir"))
. Si desea el directorio de inicio del usuario, usePaths.get(System.getProperty("user.home"))
.También puede combinar los enfoques:
fuente
La forma más confiable e independiente de la plataforma de unir rutas en Java es usando
Path::resolve
(como se indica en JavaDoc paraPaths::get
). Para una matriz de cadenas de longitud arbitraria que representan partes de una ruta, estas se pueden unir utilizando una secuencia de Java:fuente
Puedes hacer como
Una buena publicación detallada está aquí .
fuente