Séparateur de fichier autorisé dans java. io. File


A trouvé une question déroutante en apprenant sur les séparateurs de fichiers

Supposons que le fichier c:\book\java existe. Laquelle des lignes de code suivantes crée un objet qui représente le fichier? (Choisissez toutes les réponses qui s'appliquent.)

1. new File("c:\book\java"); 2. new File("c:\\book\\java"); 3. new File("c:/book/java"); 4. new File("c://book//java"); 5. None of the above

Le livre (supposig un système de fichiers basé sur dos) dit que

  1. & 3. sont la bonne réponse
  1. est correct car Java nécessite qu'une barre oblique inverse soit échappée avec une autre barre oblique inverse.
  2. est également correct parce que Java convertira les barres obliques à la bonne lorsque vous travaillez avec des chemins..
  • 4 Peut-il aussi être correct par cette logique?
  • et quand je passe au système de fichiers mac/linux-quelle devrait être la réponse ? ( mise à jour: nous ne créons qu'un objet fichier-si cela a du sens n'est pas la question ici-la question est de savoir lequel d'entre eux retournera finalement le chemin indiqué ci-dessus)
Author: Saurabh, 2018-03-04

3 answers

4 Peut-il aussi être correct par cette logique?

Étant donné que la question est

Supposons que le fichier c:\book\java existe. Lequel des éléments suivants lignes de code crée un objet qui représente le fichier? (Choisissez toutes les qui s'appliquent.)

  1. nouveau fichier("c:\book\java");
  2. nouveau fichier("c:\book\java");
  3. nouveau fichier("c:/book/java");
  4. nouveau fichier("c://book//java");
  5. Aucun de ce qui précède

2 et 3 sont évidemment corrects. Alors, l'objet File dans 4 "crée-t-il un ojbect qui représente le fichier"?

Oui, c'est le cas.

En Supposant que C:\book\java existe, ce code

public static void main( String[] args ) throws IOException
{
    File f = new File( args[ 0 ] );
    System.err.printf( "args[0]: %s\n", args[ 0 ] );
    System.err.printf( "Path: %s\n", f.getCanonicalPath() );
}

Produit cette sortie:

args[0]: C://book//java
Path: C:\book\java

, Donc new File( "C://book//java" ) plus certainement "crée un objet qui représente le fichier" et est également une réponse correcte.

Tout argument qu'il ne fait pas est littéralement incorrect. La question est de savoir si la chaîne " crée ou non un objet qui représente le fichier". C://book//java fait manifestement exactement cela.

 1
Author: Andrew Henle, 2018-03-05 11:16:52

Gardez à l'esprit que la barre oblique inverse ( \ ) est un caractère spécial en Java. Lorsque vous voulez placer un caractère de barre oblique inverse unique{[10] } dans une chaîne, vous devez l'écrire comme:

"\\"

Ce qui précède est une chaîne de longueur 1.

Chaque système d'exploitation a un seul caractère qui sert de séparateur entre les composants de chemin. Quoi qu'il en soit, vous devez spécifier un caractère entre les composants path.*

Les choix 2 et 3 sont corrects car ils placent un single caractère entre les composants du chemin.

Le choix 4 place deux caractères entre les composants du chemin, ce qui est incorrect. La barre oblique, /, n'est pas un caractère spécial en Java; si vous l'écrivez deux fois, ce sont simplement deux caractères.

Le choix 1 n'est pas Java légal. L'antislash est un caractère spécial; dans les littéraux de Chaîne, une barre oblique inverse commence un séquence d'échappement, et "\j" n'est pas valide pour les séquences d'échappement. "\b " est valide mais ne fera pas ce que vous voulez; dans en particulier, il en résultera un caractère (invisible), plutôt qu'une barre oblique inverse suivie d'un b.

Pour répondre à votre dernière question: Il n'y a pas de C: sous Linux ou OS X, donc alors que "C:/book/java" est un chemin syntaxiquement légal, il n'existera pas (sauf si quelqu'un a décidé de créer son propre répertoire nommé C: dans le répertoire courant, ce qui est assez improbable et n'est presque certainement pas ce que vous vouliez).

* Techniquement, les chemins peuvent avoir plusieurs séparateurs contigus, mais c'est pas de sens de le faire.

 1
Author: VGR, 2018-03-04 06:27:25

Barre oblique n'est pas caractère d'échappement antislash est un caractère d'échappement. Il faut deux barres obliques inverses pour représenter un seul séparateur de fichier dans le chemin d'accès au fichier, mais une seule barre oblique pour représenter un seul séparateur de fichier-où les barres obliques sont doublées, ce qui représente deux séparateurs de fichier d'affilée.

Si vous passez à Mac ou Linux, alors la prémisse de la question, qu'il y a un fichier c:\book\java, n'a aucun sens.

L'astuce à cette question est que vous je dois penser à la fois aux séparateurs de fichiers et à la façon dont les chaînes en Java sont échappées en même temps.

 0
Author: kshetline, 2018-03-04 05:59:42