Je travaille sur un projet et l'une des conditions est que si le deuxième argument de la méthode principale commence par "/
" (Pour Linux), il doit le considérer comme un chemin absolu (pas un problème), mais s'il ne commence pas par “/
”, il devrait obtenir le chemin de travail actuel de la classe et lui ajouter l'argument donné.
Je peux obtenir le nom de la classe de plusieurs manières: System.getProperty("Java.class.path")
, new File(".")
et getCanonicalPath()
, etc.
Le problème est que cela ne me donne que le répertoire dans lequel les paquets sont stockés - c’est-à-dire que si une classe est stockée dans ".../project/this/is/package/name
", Cela ne me donnera que "/project/
" Et ignore le nom du paquet où réside le .class files
réel.
Aucune suggestion?
EDIT: Voici l'explication, tirée de la description de l'exercice
sourcedir peut être absolu (commençant par "/") ou relatif à l'endroit où nous exécutons le programme depuis
sourcedir est un argument donné pour la méthode principale. Comment puis-je trouver ce chemin?
Utilisez this.getClass().getCanonicalName()
pour obtenir le nom complet de la classe.
Notez qu'un nom de package/classe ("a.b.C") est différent du chemin des fichiers .class (a/b/C.class) et que l'utilisation du nom de package/nom de classe pour dériver un chemin est généralement une mauvaise pratique. Les ensembles de fichiers/packages de classe peuvent se trouver dans plusieurs chemins de classes différents, qui peuvent être des répertoires ou des fichiers JAR.
Il y a une classe, Class
, qui peut faire ceci:
Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass(); // if you want to use the current class
System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());
Si c
représentait la classe MyClass
dans le package mypackage
, le code ci-dessus serait imprimé:
Paquet: mypackage
Classe: MyClass
Identifiant complet: mypackage.MyClass
Vous pouvez prendre ces informations et les modifier selon vos besoins, ou vous rendre à consultez l'API pour plus d'informations.
Le nom complet est défini comme suit:
String fqn = YourClass.class.getName();
Mais vous devez lire une ressource de classpath. Donc utiliser
InputStream in = YourClass.getResourceAsStream("resource.txt");
utilisez this.getClass().getName()
pour obtenir packageName.className
et utilisez this.getClass().getSimpleName()
pour obtenir uniquement le nom de la classe