J'essaie de lire un fichier texte qui est défini dans la variable système CLASSPATH. Pas une variable utilisateur.
J'essaye d'obtenir le flux d'entrée dans le fichier comme ci-dessous:
Placez le répertoire de file ( D:\myDir
) dans CLASSPATH et essayez ci-dessous:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Placez le chemin complet du fichier ( D:\myDir\SomeTextFile.txt
) dans CLASSPATH et essayez la même chose au-dessus de 3 lignes de code.
Mais malheureusement, AUCUN d'entre eux ne fonctionne et je suis toujours null
dans mon InputStream in
.
getResourceAsStream()
File.Separator
- parce que vous ne demandez pas de fichier , vous demandez une ressource . Il est important de comprendre que l'abstraction impliquée n'est pas le système de fichiers.Class.getResourceAsStream
c'est vraiment une méthode pratique pour appelerClassLoader.getResourceAsStream
, mais avec la fonctionnalité supplémentaire de ressources "relatives". Si vous spécifiez une ressource absolue, tout appel utilisant le même chargeur de classe fera la même chose.Lorsque vous utilisez Spring Framework (soit comme une collection d'utilitaires ou un conteneur - vous n'avez pas besoin d'utiliser cette dernière fonctionnalité), vous pouvez facilement utiliser l' abstraction des ressources .
Grâce à l' interface de ressource , vous pouvez accéder à la ressource en tant que InputStream , URL , URI ou fichier . Changer le type de ressource par exemple en une ressource de système de fichiers est une simple question de changer l'instance.
la source
Voici comment je lis toutes les lignes d'un fichier texte sur mon chemin de classe, en utilisant Java 7 NIO:
NB ceci est un exemple de la façon dont cela peut être fait. Vous devrez apporter des améliorations si nécessaire. Cet exemple ne fonctionnera que si le fichier est réellement présent sur votre chemin de classe, sinon une NullPointerException sera levée lorsque getResource () retourne null et .toURI () est invoqué dessus.
De plus, depuis Java 7, un moyen pratique de spécifier les jeux de caractères consiste à utiliser les constantes définies dans
java.nio.charset.StandardCharsets
(ce sont, selon leur javadocs , "garanties d'être disponibles sur chaque implémentation de la plate-forme Java").Par conséquent, si vous savez que le codage du fichier est UTF-8, spécifiez explicitement le jeu de caractères
StandardCharsets.UTF_8
la source
Spring
's'StreamUtils.copyToString
.S'il vous plaît essayez
Vos essais n'ont pas fonctionné car seul le chargeur de classe pour vos classes peut charger à partir du chemin de classe . Vous avez utilisé le chargeur de classe pour le système java lui-même.
la source
Pour lire réellement le contenu du fichier, j'aime utiliser Commons IO + Spring Core. En supposant que Java 8:
Alternativement:
la source
Pour obtenir le chemin absolu de la classe, essayez ceci:
la source
D'une certaine manière, la meilleure réponse ne fonctionne pas pour moi. Je dois utiliser un code légèrement différent à la place.
J'espère que cela aidera ceux qui rencontrent le même problème.
la source
Si vous utilisez la goyave:
nous pouvons obtenir l'URL de CLASSPATH:
ou InputStream:
la source
Pour lire le contenu d'un fichier dans une chaîne à partir de
classpath
, vous pouvez utiliser ceci:Remarque:
IOUtils
fait partie deCommons IO
.Appelez ça comme ceci:
la source
Vous dites "J'essaie de lire un fichier texte défini dans la variable système CLASSPATH". Je suppose que c'est sur Windows et vous utilisez cette boîte de dialogue laide pour éditer les "Variables système".
Vous exécutez maintenant votre programme Java dans la console. Et cela ne fonctionne pas: la console obtient une copie des valeurs des variables système une fois au démarrage . Cela signifie que toute modification ultérieure de la boîte de dialogue n'a aucun effet.
Il y a ces solutions:
Démarrer une nouvelle console après chaque changement
Utilisez
set CLASSPATH=...
dans la console pour définir la copie de la variable dans la console et lorsque votre code fonctionne, collez la dernière valeur dans la boîte de dialogue des variables.Mettez l'appel à Java dans un
.BAT
fichier et double-cliquez dessus. Cela créera une nouvelle console à chaque fois (copiant ainsi la valeur actuelle de la variable système).ATTENTION: Si vous avez également une variable utilisateur,
CLASSPATH
elle occultera votre variable système. C'est pourquoi il est généralement préférable de placer l'appel à votre programme Java dans un.BAT
fichier et de définir le chemin d'accès aux classes (en utilisantset CLASSPATH=
) plutôt que de compter sur un système global ou une variable utilisateur.Cela garantit également que plusieurs programmes Java peuvent fonctionner sur votre ordinateur car ils sont liés par des chemins de classe différents.
la source
Ma réponse n'est pas exactement ce qui est demandé dans la question. Je donne plutôt une solution exactement avec quelle facilité nous pouvons lire un fichier dans notre application java à partir de notre chemin de classe de projet.
Par exemple, supposons un nom de fichier de configuration example.xml se trouve dans un chemin comme ci-dessous: -
com.myproject.config.dev
et notre fichier de classe exécutable java est dans le chemin ci-dessous: -
com.myproject.server.main
il suffit maintenant de vérifier à la fois le chemin ci-dessus qui est le répertoire / dossier commun le plus proche d'où vous pouvez accéder à la fois au répertoire / dossier dev et principal (com.myproject.server.main - où la classe exécutable java de notre application a existé) - Nous pouvons voir que c'est le dossier / répertoire myproject qui est le répertoire / dossier commun le plus proche à partir duquel nous pouvons accéder à notre fichier example.xml. Par conséquent , à partir d' une classe réside exécutables Java dans le dossier / répertoire principal , nous devons revenir à deux pas comme ../../ d'accès myproject . Maintenant, après cela, voyez comment nous pouvons lire le fichier: -
la source
Si vous compilez votre projet dans un fichier jar: vous pouvez mettre votre fichier dans resources / files / your_file.text ou pdf;
et utilisez ce code:
la source
J'utilise le serveur d'applications Webshpere et mon module Web est basé sur Spring MVC. Ils
Test.properties
étaient situés dans le dossier des ressources, j'ai essayé de charger ces fichiers en utilisant les éléments suivants:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Aucun des codes ci-dessus n'a chargé le fichier.
Mais à l'aide du code ci-dessous, le fichier de propriétés a été chargé avec succès:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Merci à l'utilisateur "user1695166" .
la source
Utilisation
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
la source
Scénario:
1)
client-service-1.0-SNAPSHOT.jar
a une dépendanceread-classpath-resource-1.0-SNAPSHOT.jar
2) nous voulons lire le contenu des ressources de chemin de classe (
sample.txt
) de àread-classpath-resource-1.0-SNAPSHOT.jar
traversclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
asrc/main/resources/sample.txt
1.
pom.xml
deread-classpath-resource-1.0-SNAPSHOT.jar
2.
ClassPathResourceReadTest.java
classe dansread-classpath-resource-1.0-SNAPSHOT.jar
laquelle charge le contenu du fichier de ressources du chemin de classe.3.
pom.xml
declient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
instancier laClassPathResourceReadTest.java
classe où, il va chargersample.txt
et imprimer également son contenu.5. exécutez le fichier exécutable comme suit:
la source
N'utilisez pas la méthode getClassLoader () et utilisez le "/" avant le nom du fichier. "/" c'est tres important
la source
/
a exactement le même effet que l'utilisation de lagetClassLoader()
méthode.la source
vous devez mettre votre «variable système» sur le chemin de classe java.
la source