txt texto ruta online manipular leer guardar especificar datos crear compila como array archivo java string file-io cross-platform jdk1.6

texto - ¿Existe una utilidad de Java que convierta una ruta de String para usar el carácter correcto del separador de archivos?



leer un archivo csv y guardar datos en un array java (9)

¿No debería ser suficiente decir:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"

He desarrollado una serie de clases que manipulan archivos en Java. Estoy trabajando en un cuadro de Linux, y he estado escribiendo maravillosamente el new File("path/to/some/file"); . Cuando llegó el momento de comprometerse, me di cuenta de que algunos de los otros desarrolladores del proyecto están usando Windows. Ahora me gustaría llamar a un método que puede tomar una Cadena de la forma "/path/to/some/file" y, dependiendo del sistema operativo, devolver una ruta correctamente separada.

Por ejemplo:
"path/to/some/file" convierte en "path//to//some//file" en Windows.
En Linux solo devuelve la cadena dada.

Me doy cuenta de que no tardaré en encontrar una expresión regular que pueda hacer esto, pero no busco reinventar la rueda y preferiría una solución debidamente probada. Sería bueno si estuviera integrado en el JDK, pero si es parte de una pequeña biblioteca F / OSS, también está bien.

Entonces, ¿hay una utilidad Java que convierta una ruta de String para usar el carácter correcto del separador de archivos?


¿Tienes la opción de usar

System.getProperty("file.separator")

para construir la cadena que representa la ruta?


Apache Commons viene al rescate (otra vez). El método Commons IO FileNameUtils . separatorsToSystem() hará lo que quieras.

No hace falta decir que Apache Commons IO hará mucho más y merece la pena echarle un vistazo.



Creo que hay este agujero en Java Paths.

String rootStorePath = Paths.get ("c: / projects / mystuff /"). ToString ();

funciona si lo está ejecutando en un sistema que tiene el sistema de archivos que necesita usar. Como se señaló, se utilizó el sistema de archivos actual del sistema operativo.

Necesito trabajar con rutas entre Windows y Linux, por ejemplo, para copiar un archivo de uno a otro. Al usar "/" todos los trabajos, supongo que si está usando todos los comandos de Java, pero necesito hacer una llamada sftp, por lo que usar / o file.separator, etc ... no me ayuda. No puedo usar Path () porque convierte el mío al sistema de archivos predeterminado que estoy ejecutando en "ahora".

Lo que Java necesita es:
`en el sistema de Windows: ruta posixPath = Paths.get (" / home / mystuff ", FileSystem.Posix); se queda / home / mystuff / y no se convierte a / home / mystuff

en el sistema Linux: String winPath = Paths.get ("c: / home / mystuff", FileSystem.Windows) .toString (); `permanece c: / home / mystuff y no se convierte a / c: / home / mystuff

similar a trabajar con conjuntos de caracteres:

URLEncoder.encode ("lo que sea aquí", "UTF-8") .getBytes ();

PD: Tampoco quiero cargar un archivo apache io jar completo para hacer algo simple tampoco. En este caso no tienen lo que propongo de todos modos.


Esto es lo que hace Apache commons-io, desarrollado en un par de líneas de código:

String separatorsToSystem(String res) { if (res==null) return null; if (File.separatorChar==''//') { // From Windows to Linux/Mac return res.replace(''/'', File.separatorChar); } else { // From Linux/Mac to Windows return res.replace(''//', File.separatorChar); } }

Entonces, si quieres evitar la dependencia extra, solo usa eso.


Para cualquiera que intente hacer esto 7 años más tarde, el método separatorsToSystem de apache commons se ha movido a la clase FilenameUtils:

FilenameUtils.separatorsToSystem(String path)


Un "/path/to/some/file" realmente funciona bajo Windows Vista y XP.

new java.io.File("/path/to/some/file").getAbsoluteFile() > C:/path/to/some/file

Pero todavía no es portátil ya que Windows tiene múltiples roots . Así que el directorio raíz tiene que ser seleccionado de alguna manera. No debería haber ningún problema con las rutas relativas.

Editar:

Apache commons io no ayuda con envs que no sean Unix y Windows. Código fuente de apache io :

public static String separatorsToSystem(String path) { if (path == null) { return null; } if (isSystemWindows()) { return separatorsToWindows(path); } else { return separatorsToUnix(path); } }


String fileName = Paths.get(fileName).toString();

Funciona perfectamente con Windows al menos incluso con rutas mixtas, por ejemplo

c: / users / username / myproject / myfiles / myfolder

se convierte en

c:/users/username/myproject/myfiles/myfolder

Lo sentimos, no he comprobado qué haría Linux con lo anterior, pero nuevamente la estructura de archivos de Linux es diferente, por lo que no buscaría un directorio de este tipo