this.getClass (). getResource (""). getPath () gibt einen falschen Pfad zurück

8

Ich mache gerade ein kleines einfaches Java-Programm für mein Computer Science-Finale, das den Pfad der aktuellen laufenden Klasse bekommen muss. Die Klassendateien befinden sich im Ordner C: \ 2013 \ game \.

Um diesen Pfad zu erhalten, rufe ich dieses Code-Segment in meinem Hauptklassenkonstruktor auf:

%Vor%

Dieser Befehl gibt jedoch diesen String zurück: "/" trotz der korrekten Ausgabe "C: / 2013 / game" Darüber hinaus habe ich versucht, dies zu beheben, indem Sie diesen Code verwenden:

%Vor%

Dies gibt eine NullPointerException zurück, die darauf zurückzuführen ist, dass getClassLoader () trotz der Arbeit an meiner Eclipse-IDE null zurückgibt. Irgendwelche Ideen?

    
user2465495 10.06.2013, 15:32
quelle

7 Antworten

7

Wenn Sie eine Datei im selben Pfad wie der Code laden wollen, schlage ich vor, dass Sie sie in den gleichen Stammordner wie den Code und nicht in den Pfad der Klasse einfügen.

Grund: Die Klasse kann sich in einem Jar befinden, die Datendatei kann in dasselbe Jar gesetzt werden, aber es ist schwieriger zu bearbeiten und zu aktualisieren.

Schlagen Sie auch vor, dass Sie die in Kommentaren vorgeschlagene Präferenzklasse sehen: Ссылка In einigen Fällen ist es in Ordnung, eine eigene Datei mit Daten / excel / csv / java.util.Properties zu haben.

Ich bin mir nicht sicher, warum es in Eclipse funktioniert, aber ich würde vorschlagen, dass Sie sich darauf konzentrieren, es von einer Eingabeaufforderung / einem Terminal aus zu starten, da dies der "echte Modus" ist, wenn er live geht.

Du könntest einfach nach deiner Klasse fragen

%Vor%

Dies wird dir geben

  

name TstPath.class   Datei: /java/Projects/tests3b/build/classes/s/TstPath.class

Was ist mein Eclipse-Build-Pfad ...

muss dies analysieren, um den Pfad zu erhalten, wo die Klasse geladen wurde.

Denken Sie daran:

  1. Die App könnte von woanders gestartet werden
  2. Klasse kann in jar sein, dann wird der Pfad anders sein (wird auf ein jar und eine Datei innerhalb dieses
  3. zeigen)
  4. Klassenpfade können zur Laufzeit viele sein und Punkt 1
  5. Eine Klasse könnte zur Laufzeit über Netzwerk / Proxy / Injection usw. erstellt werden und daher keine Dateiquelle haben, daher ist dies keine generische Lösung.
  6. Denken Sie darüber nach, was Sie auf einer höheren Ebene erreichen wollen, und stellen Sie diese Frage. Bedeutung, warum willst du diesen Weg?
  7. Möchten Sie den App-Pfad: -

    Datei f = neue Datei ("./");
     f.getCanonicalPath (); // ...

So kann eine App aus dem Ordner c: \ app1 \ run \

gestartet werden

Das Jar könnte sich in c: \ app1 \ libsMain \ myapp.jar

befinden

und ein Hilfs-jar könnte bei c: \ commonlibs \ set1

sein

Dies wird Ihnen nur sagen, wo die JVM Ihre Klasse gefunden hat, die möglicherweise nicht das ist, was Sie brauchen.

Wenn Sie in einem Jar unter UNIX oder Windows etwas ähnliches finden,

  

jar: Datei: c: \ app \ my.jar! /s/TstPath.class

Wenn Paket s und Klasse TstPath ist, können Sie sicher sein, dass dies funktioniert, da die Klasse dort sein muss ...

jetzt, um dies zu analysieren, können Sie nach Ihrem Klassennamen suchen und / oder entfernen, bis Sie den gewünschten Pfad erhalten. String lastIndexOf hilft

    
tgkprog 10.06.2013 15:43
quelle
3

Sie können verwenden:

%Vor%     
NINCOMPOOP 10.06.2013 15:37
quelle
1

Der Aufruf von getResource([String]) erfordert einen Pfad relativ zum Ordner, der die Klasse enthält, von der er aufgerufen wird. Wenn Sie also Folgendes haben, muss alles, was Sie in MyClass.class.getResource([path]); übergeben, ein gültiger Pfad relativ zum com/putable/ -Paket-Ordner sein und auf eine echte Datei verweisen:

%Vor%

Die leere Zeichenfolge ist einfach nicht gültig, da niemals ein Dateiname vorhanden sein kann, der der leeren Zeichenfolge entspricht. Aber du könntest getResource(getClass().getSimpleName()) machen. Entfernen Sie einfach den Dateinamen vom Ende des von diesem Aufruf zurückgegebenen Pfades und Sie haben das gewünschte Klassenverzeichnis.

    
CodeBlind 10.06.2013 15:38
quelle
1
%Vor%

auch

%Vor%     
Alpesh Gediya 10.06.2013 15:38
quelle
0

Versuchen Sie es.

%Vor%     
Makky 10.06.2013 15:37
quelle
0

Verwenden Sie diesen Code

%Vor%

besuchen Sie den Link für weitere Informationen Finde heraus, woher die Java-Klasse geladen wird

    
Prabhaker 10.06.2013 15:55
quelle
0

Gib den absoluten Pfad für eine Datei in deinem Klassenpfad aus, dh build / resources / main / someFileInClassPath.txt. Haftungsausschluss, dies ist ähnlich zu einer anderen Lösung auf dieser Seite, die TT.class ... verwendet, aber das hat bei mir nicht funktioniert stattdessen hat TT..getClassLoader () ... für mich funktioniert.

%Vor%     
shane 08.06.2016 22:58
quelle

Tags und Links