34 votes

nouveau fichier ("") vs nouveau fichier ("."): fonctionnalité ou bogue?

new File("") et new File(".") rendement de l'canonique même chemin, mais le premier objet est unsubable. Envisager de code ci-dessous, et comment les deux objets de revenir par le même chemin canonique. La documentation indique le chemin canonique est "à la fois absolue et unique". Pourtant, seulement le Fichier créé avec le "." l'argument est réellement utilisable.

Ne devrait pas être une exception lancée à un moment donné? Soit dans la chaîne vide appel du constructeur (puisque l'objet créé ne semble pas valide), ou au moins dans getCanonicalPath (dont au moins déclare 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();
  }
}

Et le résultat qu'il produit:

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

17voto

Agemen Points 905

Tout en utilisant le constructeur avec la Chaîne vide, vous créez un Fichier exemple qui a deux propriétés :

  • Il n'existe en réalité.
  • Son chemin absolu est le "vide abstrait chemin d'accès"

Lors de l'utilisation de Fichier("."), vous créez un autre fichier :

  • Il N'existe pas sur le système de fichiers
  • Son chemin absolu contient le caractère "."

Ce deuxième fichier existe, pas le premier. Le deuxième fichier est par conséquent le seul qui est censé respecter la règle expliqué dans getCanonicalPath :

Chaque chemin qui dénote un fichier ou répertoire a une unique forme canonique.

Comme le premier fichier n'est pas réel, le fait que leur canonique chemins sont égaux est dénuée de sens.

Par conséquent, la behviour vous l'avez indiqué n'est pas un bug. C'est celui que nous attendions de la JVM.

Vous trouverez toutes les infos dans la javadoc

11voto

kishi Points 2470

En passant une chaîne vide pour le constructeur, vous créez un vide abstrait chemin d'accès'. De la java.io.Fichier Javadoc:

Si la chaîne est vide chaîne de caractères, alors le résultat est le vide résumé chemin.

Le "vide abstrait chemin" dans ce cas n'existe pas physiquement, par conséquent exists() évalue false. La raison pour laquelle vous obtenez un répertoire pour la chaîne vide est décrit dans la Javadoc de l' getAbsolutePath:

Si ce résumé chemin d'accès est le vide résumé chemin d'accès, puis le chemin d'accès chaîne de l'actuel répertoire de l'utilisateur, qui est nommé par le système de la propriété de l'utilisateur.dir, est renvoyé.

5voto

ddewaele Points 11888

Selon les javaDocs:

Chaque chemin d'accès qui désigne un fichier ou un répertoire existant a une forme canonique unique.

Dans votre premier exemple, vous faites référence au "fichier sans nom".

Comme celui-ci n'existe pas, je ne pense pas que ce soit un bug que le nouveau fichier ("") et le nouveau fichier (".") Produisent le même chemin canonique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X