nuevo Archivo("") frente a new File("."): Característica o Bug?


new File("") y new File(".") producen el mismo camino canónico, sin embargo, el objeto anterior es insustituible. Considere el código a continuación y cómo ambos objetos devuelven la misma ruta canónica. La documentación establece el camino canónico es "tanto absoluto como ú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? Ya sea en la llamada del constructor de cadena vacía (ya 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 la salida 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
Author: Joachim Sauer, 2011-05-04

3 answers

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

  • en realidad no existe.
  • Su ruta absoluta es la"ruta abstracta vacía"

Cuando se usa File("."), se crea un archivo diferente:

  • Existe en el sistema de archivos
  • Su ruta de acceso absoluta contiene"."carácter

Este segundo archivo existe, no el primero. El segundo archivo es, por lo tanto, el único uno que se supone que debe respetar la regla explicada en getCanonicalPath:

Cada nombre de 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 behviour que has apuntado no es un error. Es el que esperábamos de la JVM.

Encontrarás todas las informaciones en el javadoc

 14
Author: Agemen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 07:59:06

Al pasar una cadena vacía al constructor, está creando una 'ruta abstracta'vacía. Desde el archivo java.io.Javadoc :

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

La 'ruta abstracta vacía' en este caso no existe físicamente, por lo tanto exists() se evalúa como false. La razón por la que obtiene un directorio para la cadena vacía se describe en el Javadoc de getAbsolutePath:

Si esta ruta abstracta es la vacía ruta abstracta luego la ruta cadena del directorio de usuario actual, que es nombrado por la propiedad system usuario.dir, es devuelto.

 9
Author: vahidg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 13:31:22

Según los javaDocs:

Cada 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(".") cede el mismo camino canónico.

 5
Author: ddewaele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 13:18:27