web-dev-qa-db-fra.com

Comment fonctionnent les chemins de fichiers relatifs dans Eclipse?

Donc, ma résolution du nouvel an 2009 est d'apprendre Java. J'ai récemment acquis "Java for Dummies" et j'ai suivi le code de démonstration du livre en le réécrivant à l'aide d'Eclipse. Quoi qu'il en soit, chaque exemple du livre qui utilise un chemin relatif ne semble pas lire le fichier .txt à partir duquel il est censé lire.

Voici l exemple de code:

import Java.util.Scanner;
import Java.io.File;
import Java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import Java.awt.GridLayout;

class TeamFrame extends JFrame {

    public TeamFrame() throws IOException {
        PlayerPlus player;
        Scanner myScanner = new Scanner(new File("Hankees.txt"));

        for (int num = 1; num <= 9; num++) {
            player = new PlayerPlus(myScanner.nextLine(), myScanner.nextDouble());
            myScanner.nextLine();
            addPlayerInfo(player);
        }      

        add(new JLabel());
        add(new JLabel("   ------"));
        add(new JLabel("Team Batting Aberage:"));
        add(new JLabel(PlayerPlus.findTeamAverageString()));
        setTitle("The Hankees");
        setLayout(new GridLayout(11,2));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    void addPlayerInfo(PlayerPlus player) {
        add(new JLabel(player.getName()));
        add(new JLabel(player.getAverageString()));
    }
}

Et vous pouvez voir dans la capture d'écran ci-dessous que j'ai inclus ce fichier.

l'image n'est plus disponible

En outre, j'ai vérifié que, lorsque je construis l'application, une copie de Hankees.txt est placée dans le dossier bin avec les fichiers .class compilés.

Enfin, si je modifie la ligne 12 comme suit et que je place Hankees.txt à la racine de mon lecteur C: \, le programme est compilé et fonctionne correctement.

Scanner myScanner = new Scanner(new File("C:\\Hankees.txt"));

Donc, fondamentalement, ma question est qu'est-ce que je fais mal? Ou bien Eclipse en est-il responsable?

Merci pour toute aide!

53
PHLAK

Vous avez besoin "src/Hankees.txt"

Votre fichier se trouve dans le dossier source qui n’est pas compté comme répertoire de travail. \

Ou vous pouvez déplacer le fichier dans le répertoire racine de votre projet et utiliser simplement "Hankees.txt"

75
jjnguy

Ceci est vraiment similaire à une autre question. Comment dois-je charger des fichiers dans mon Java application? )

Comment charger mes fichiers dans mon Java Application?

Vous ne voulez pas charger vos fichiers par:

C:\your\project\file.txt

c'est mauvais!

Vous devriez utiliser getResourceAsStream.

InputStream inputStream = YourClass.class.getResourceAsStream(“file.txt”);

Et aussi vous devriez utiliser File.separator ; qui est le caractère séparateur de nom dépendant du système, représenté par une chaîne pour plus de commodité.

7
Bernie Perez

Le chemin de génération d'un projet définit les ressources de vos dossiers source qui sont copiées dans vos dossiers de sortie. Généralement, cette option est définie sur Inclure tous les fichiers.

Les nouvelles configurations d'exécution utilisent par défaut le répertoire du projet pour le répertoire de travail, bien que cela puisse également être modifié.

Ce code montre la différence entre le répertoire de travail et l'emplacement d'où la classe a été chargée:

public class TellMeMyWorkingDirectory {
    public static void main(String[] args) {
        System.out.println(new Java.io.File("").getAbsolutePath());
        System.out.println(TellMeMyWorkingDirectory.class.getClassLoader().getResource("").getPath());
    }
}

La sortie sera probablement quelque chose comme:

C:\your\project\directory
/C:/your/project/directory/bin/
7
Stephen Denne

Oui, Eclipse considère le répertoire principal comme le répertoire de travail/racine, aux fins des chemins.

... juste pensé que j'ajouterais quelques informations supplémentaires. Je suis nouveau ici! Je voudrais aider.

5
nasty pasty

Vous pouvez toujours obtenir votre chemin d’exécution en utilisant:

 String path = new File(".").getCanonicalPath();

Cela fournit des informations précieuses sur l'emplacement des fichiers et des ressources.

2
Sudip Bhandari

Paraphrasant from http://Java.Sun.com/javase/6/docs/api/Java/io/File.html :

Les classes sous Java.io résout les chemins d'accès relatifs par rapport au répertoire de l'utilisateur actuel, qui est généralement le répertoire dans lequel la machine virtuelle a été démarrée.

Eclipse définit le répertoire de travail sur le dossier de projet de niveau supérieur.

2
Rob

j'ai le même problème. Si YourClass et Hankees.txt ont un seul répertoire dans votre projet, alors je trouve ce qui suit - pas si mal.

import Java.net.URL;
//<...>
URL url = YourClass.class.getClassLoader().getResource("Hankees.txt");
String filesPathAndName = url.getPath();        
Scanner myScanner = new Scanner(new File(filesPathAndName))
//<...>
1
steelsdv