File.separator vs FileSystem.getSeparator () vs System.getProperty ("file.separator")?

136

Parece que hay tres formas idénticas de obtener el "separador de archivos" dependiente de la plataforma de forma independiente:

¿Cómo decidimos cuándo usar cuál?

¿Hay alguna diferencia entre ellos?

Pacerier
fuente
¿No estás obteniendo el separador de archivos dependiente de la plataforma aquí? Solo en una mansión independiente de la plataforma.
steinybot
@Steiny, sí, actualizado.
Pacerier
Una pregunta típica de Java tiene al menos 3 o más respuestas
Stimpson Cat

Respuestas:

142

System.getProperties()puede ser anulado por llamadas a System.setProperty(String key, String value)o con parámetros de línea de comando-Dfile.separator=/

File.separator obtiene el separador para el sistema de archivos predeterminado.

FileSystems.getDefault() te da el sistema de archivos predeterminado.

FileSystem.getSeparator()le da el carácter separador para el sistema de archivos. Tenga en cuenta que, como método de instancia, puede usar esto para pasar diferentes sistemas de archivos a su código que no sea el predeterminado, en los casos en que necesite su código para operar en múltiples sistemas de archivos en una sola JVM.

Bringer128
fuente
2
Cool = D Btw, ¿podrías explicar la parte de "operar múltiples sistemas de archivos"?
Pacerier
44
@Pacerier En teoría, si escribiera un nuevo sistema de archivos (BringerFS) que tuviera un carácter separador de ":" y tuviera una máquina con 2 particiones, una en NTFS y otra en BringerFS, esta funcionalidad le permitiría usar ambas (suponiendo También escribí un proveedor de Java Filesystem).
Bringer128
Quiero decir, prácticamente es útil, como decir que alguien tenía 2 particiones, una de Windows y una de UNIX, y está ejecutando mi aplicación (en su partición de Windows), ¿esa clase puede acceder a su sistema de archivos UNIX? (Realmente no pude probar esto porque no tengo otro FileSystem instalado.)
Pacerier
1
Sospecho que la mayoría de los controladores para sistemas de archivos en Windows realizan la traducción a una API de sistema de archivos 'estilo Windows' para permitir que el sistema operativo y las aplicaciones no portátiles funcionen. El uso práctico tendría que ser para un sistema operativo que admita sistemas de archivos extraños y maravillosos sin un paradigma fijo como Windows.
Bringer128
Ah, y para responder a su otra pregunta, tendría una FileSysteminstancia diferente para cada sistema de archivos con el que se ocupó.
Bringer128
31

Si su código no cruza los límites del sistema de archivos, es decir, solo está trabajando con un sistema de archivos, entonces úselo java.io.File.separator.

Esto, como se explicó, le proporcionará el separador predeterminado para su FS. Como explicó Bringer128, System.getProperty("file.separator")se puede anular a través de las opciones de línea de comandos y no es tan seguro como el tipo java.io.File.separator.

El último, java.nio.file.FileSystems.getDefault().getSeparator();se introdujo en Java 7, por lo que podría ignorarlo por ahora si desea que su código sea portátil en versiones anteriores de Java.

Entonces, cada una de estas opciones es casi la misma que otras, pero no del todo. Elija uno que se adapte a sus necesidades.

darioo
fuente
¿Está java.ioen desuso a favor de java.nio?
Pacerier
13
@Pacerier: no, no está en desuso. java.ioes un nivel un poco más bajo java.nio, pero sigue siendo muy y muy útil. Puedes ver las diferencias aquí: blogs.oracle.com/slc/entry/javanio_vs_javaio . niono reemplaza io, lo extiende de múltiples maneras (y usa iodebajo del capó).
darioo