Pregunta nuevo archivo ("") vs. nuevo archivo ("."): ¿característica o error?


new File("") y new File(".") cede el mismo camino canónico, pero el primer objeto es indestructible. Considere el siguiente código y cómo ambos objetos devuelven la misma ruta canónica. La documentación indica el camino canónico es "absoluto y único". Sin embargo, solo el archivo creado con el "." el argumento es realmente utilizable

¿No debería lanzarse una excepción en algún momento? ¿O bien en la llamada de constructor de cadena vacía (dado que el objeto creado no parece válido), o al menos en getCanonicalPath (que al menos declara IOException)?

import java.io.File;
import java.io.IOException;

public abstract class Test {

    public static void main(String[] args) throws Exception {
        testFile("");
        testFile(".");
    }

    private static void testFile(String arg) throws IOException {
        System.out.format("File constructor argument: \"%s\"\n", arg);
        File g = new File(arg);
      System.out.format("toString()            = \"%s\"\n", g.toString());
        System.out.format("getAbsolutePath()     = \"%s\"\n", g.getAbsolutePath());
        System.out.format("getAbsoluteFile()     = \"%s\"\n", g.getAbsoluteFile());
        System.out.format("getgetCanonicalPath() = \"%s\"\n", g.getCanonicalPath());
        System.out.format("getgetCanonicalFile() = \"%s\"\n", g.getCanonicalFile());
        System.out.format("exists()              = %s\n", g.exists());
        System.out.format("isDirectory()         = %s\n", g.isDirectory());
        System.out.println();
  }
}

Y el resultado que produce:

File constructor argument: ""
toString()            = ""
getAbsolutePath()     = "C:\usr\workspace\Test"
getAbsoluteFile()     = "C:\usr\workspace\Test"
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists()              = false
isDirectory()         = false

File constructor argument: "."
toString()            = "."
getAbsolutePath()     = "C:\usr\workspace\Test\."
getAbsoluteFile()     = "C:\usr\workspace\Test\."
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists()              = true
isDirectory()         = true

32
2018-05-04 13:00


origen


Respuestas:


Mientras utiliza el constructor con la cadena vacía, crea una instancia de archivo que tiene dos propiedades:

  • En realidad, no existe.
  • Su ruta de acceso absoluta es la "ruta de acceso abstracta vacía"

Al usar Archivo ("."), Crea un archivo diferente:

  • SI EXISTE en el sistema de archivos
  • Su ruta de acceso absoluta contiene el "." personaje

Este segundo archivo existe, no el primero. El segundo archivo es, en consecuencia, el único que debe respetar la regla explicada en getCanonicalPath:

Cada ruta que denota un archivo o directorio existente tiene una forma canónica única.

Como el primer archivo no es real, el hecho de que sus caminos canónicos sean iguales no tiene sentido.

En consecuencia, el comportamiento que has señalado no es un error. Es el que esperábamos de la JVM.

Encontrará todas las informaciones en el javadoc


14
2018-05-04 13:53



Al pasar una cadena vacía al constructor, está creando un "nombre de ruta de acceso" vacío. Desde el java.io.File Javadoc:

Si la cadena dada es la vacía   cadena, entonces el resultado es el vacío   ruta de acceso abstracta

El 'nombre de ruta abstracto vacío' en este caso no existe físicamente, por lo tanto exists() evalúa a false. El motivo por el que obtiene un directorio para la cadena vacía se describe en Javadoc de getAbsolutePath:

Si este nombre de ruta abstracto es el vacío   ruta de acceso abstracta luego la ruta de acceso   cadena del directorio de usuario actual,   que es nombrado por la propiedad del sistema   user.dir, se devuelve.


9
2018-05-04 13:31



De acuerdo con los javaDocs:

Cada nombre de ruta que denota un archivo o directorio existente tiene una forma canónica única.

En su primer ejemplo, se refiere a "el archivo que no tiene nombre".

Como ese no existe, no creo que sea un error que el nuevo archivo ("") y el nuevo archivo (".") Produzcan la misma ruta canónica.


5
2018-05-04 13:18