Comment lire un fichier à partir d'un chemin relatif dans un projet Java? java.io.File ne trouve pas le chemin spécifié

113

J'ai un projet avec 2 packages:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

Dans le package (2) j'ai un fichier texte ListStopWords.txt, dans le package (1) j'ai une classe FileLoadder. Voici le code en FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

Mais ayez cette erreur:

The system cannot find the path specified

Pouvez-vous donner une solution pour y remédier? Merci.

tiendv
la source
12
Vos deux exemples de packages sont les mêmes. Tu ne veux pas dire properties.filespour 2?
BalusC

Réponses:

173

S'il se trouve déjà dans le chemin de classe, récupérez-le simplement à partir du chemin de classe au lieu du système de fichiers du disque. Ne jouez pas avec les chemins relatifs java.io.File. Ils dépendent du répertoire de travail actuel sur lequel vous n'avez aucun contrôle depuis l'intérieur du code Java.

En supposant que ce ListStopWords.txtsoit dans le même package que votre FileLoaderclasse, alors faites:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

Ou si tout ce que vous recherchez en fin de compte est en fait un InputStreamélément:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Ceci est certainement préférable à la création d'un new File()car urlil ne représente pas nécessairement un chemin d'accès au système de fichiers sur disque, mais il peut également représenter un chemin d'accès au système de fichiers virtuel (ce qui peut se produire lorsque le JAR est étendu en mémoire plutôt que dans un dossier temporaire sur le système de fichiers disque) ou même un chemin réseau qui ne sont pas tous deux digestes par définition parFile constructeur.

Si le fichier est - comme le nom du package l' indique - est en fait un fichier de propriétés digne de ce nom (contenant des key=valuelignes) avec juste la "mauvaise" extension, alors vous pouvez le transmettre InputStreamimmédiatement à la load()méthode.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Remarque: lorsque vous essayez d'y accéder depuis un staticcontexte interne , utilisez FileLoader.class(ou autre chose YourClass.class) à la place des getClass()exemples ci-dessus.

BalusC
la source
FileLoader a-t-il été supprimé de Java? J'essaie de le faire à partir d'un contexte statique (java 6) et je ne trouve aucun moyen de l'importer et il n'arrête pas de me dire qu'il ne peut pas se résoudre en un type. Curieusement, il s'est complété automatiquement au fur et à mesure que je l'ai tapé, mais a ensuite continué à me donner une erreur.
turbo
2
oh, c'est censé être ClassLoader.class.
turbo
4
@turbo: FileLoaderest la propre classe personnalisée d'OP. C'est censé être exactement cette classe dans laquelle vous essayez d'obtenir la ressource. Ainsi donc NameOfYourCurrentClass.class.getResourceAsStream(...). Le ClassLoader.classéchouera si la ClassLoaderclasse est chargée par un autre chargeur de classe, ce qui peut se produire dans une application "entreprise" avec une hiérarchie de plusieurs chargeurs de classe (comme une application Web Java EE).
BalusC
Oh je vois. Je n'ai pas compris que c'était dépendant. Merci d'avoir clarifié cela!
turbo
10
Une suggestion pour savoir si le fichier n'est pas dans le même package? Dans mon cas, j'essaye d'ouvrir un fichier qui se trouve dans un package de test.
Robin Newhouse
44

La ligne suivante peut être utilisée si nous voulons spécifier le chemin relatif du fichier.

File file = new File("./properties/files/ListStopWords.txt");  
santhosh
la source
3
puis-je savoir pourquoi 3 barres obliques entre le chemin.
MSNaidu
Erreur:> Caractère d'échappement illégal dans la chaîne littérale.
IgorGanapolsky
Comment convertir cela en un InputStream?
IgorGanapolsky
1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Cameron Hudson
42

Le chemin relatif fonctionne en java en utilisant le. opérateur.

  • . signifie le même dossier que le contexte en cours d'exécution.
  • .. désigne le dossier parent du contexte en cours d'exécution.

La question est donc de savoir comment connaître le chemin où le java est actuellement à la recherche?

faire une petite expérience

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Observez la sortie, vous apprendrez à connaître le répertoire actuel où java recherche. À partir de là, utilisez simplement l'opérateur ./ pour localiser votre fichier.

par exemple si la sortie est

G: \ JAVA8Ws \ MyProject \ content.

et votre fichier est présent dans le dossier MyProject utilisez simplement

File resourceFile = new File("../myFile.txt");

J'espère que cela t'aides

Samrat
la source
après des heures de recherche, cette réponse m'a fourni la solution
erdostamasa
8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}
poulie sans friction
la source
1
@IgorGanapolsky c'est le nom de la classe. Vous ne pouvez faire référence à .classlittéral qu'en fournissant le nom complet de sa classe.
Tomasz Mularczyk
Je pense qu'il a l'intention d'être FileLoader.
jamesdeath123
6

essayer .\properties\files\ListStopWords.txt

punaise.
la source
5

J'aurais pu commenter mais j'ai moins de rep pour ça. La réponse de Samrat a fait le travail pour moi. Il est préférable de voir le chemin du répertoire actuel via le code suivant.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

Je l'ai simplement utilisé pour corriger un problème auquel je faisais face dans mon projet. Veillez à utiliser ./ pour revenir au répertoire parent du répertoire actuel.

    ./test/conf/appProperties/keystore 
dézible
la source
J'exécute mon code via tomcat et le répertoire actuel n'est donc pas le dossier du projet - Comment définir le chemin relatif vers la racine du projet? J'utilise actuellement le chemin d'accès dur: "C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli
@TiagoRedaelli consultez ces questions: stackoverflow.com/questions/12843217/…
dézible
4

Bien que la réponse fournie par BalusC fonctionne pour ce cas, elle se cassera lorsque le chemin du fichier contient des espaces car dans une URL, ceux-ci sont convertis en% 20 qui n'est pas un nom de fichier valide. Si vous construisez l'objet File en utilisant un URI plutôt qu'une chaîne, les espaces seront gérés correctement:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());
Mark Krijgsman
la source
2

Je voulais analyser 'command.json' dans src / main // js / Simulator.java. Pour cela, j'ai copié le fichier json dans le dossier src et j'ai donné le chemin absolu comme ceci:

Object obj  = parser.parse(new FileReader("./src/command.json"));
sver
la source
2

entrez la description de l'image ici

En supposant que vous vouliez lire à partir du resourcesrépertoire en FileSystemclasse.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

Remarque: L' interligne .n'est pas nécessaire.

Soleil R
la source
1

Pour moi en fait, le problème est que le chemin de classe de l'objet File provient <project folder path> or ./src, donc l'utilisation a File file = new File("./src/xxx.txt");résolu mon problème

J.Luan
la source
0

String basePath = nouveau fichier ("monFichier.txt"). GetAbsolutePath (); ce chemin de base que vous pouvez utiliser comme chemin correct de votre fichier

user13499397
la source
-1

Si vous essayez d'appeler getClass() partir d'une méthode statique ou d'un bloc statique, vous pouvez procéder de la manière suivante.

Vous pouvez appeler getClass()l' Propertiesobjet dans lequel vous chargez.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}
arun_kk
la source
Manque simplement un devis de clôture.
jamesdeath123
-1

Si le fichier texte n'est pas lu, essayez d'utiliser un chemin absolu plus proche (si vous le souhaitez, vous pouvez utiliser un chemin absolu complet,) comme ceci:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

supposons que le chemin absolu est:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
KR N
la source