Discussion:
Wie komme ich von einer URL zu einem Dateinamen?
(zu alt für eine Antwort)
Peter Müller
2023-05-12 18:59:17 UTC
Permalink
Der folgende Code funktioniert nicht:

URL url = MainWindow.class.getResource("InitializeAudio.mp3");
String fileName = url.toString();
audioClip = new javafx.scene.media.AudioClip(url.toString());
audioClip.play();

Ich dachte, dass ich das Problem über eine temporäre Datei umgehen
könnte. Ich bräuchte dazu url.toURI(), was aber auch nicht funktioniert.
Es kann eine URISyntaxException geworfen werden.
Eclipse liefert die Fehlermeldung:
"The method toURI() from the type URL refers to the missing type
URISyntaxException".
Der import von java.net.URISyntaxException funktioniert nicht.

Was kann ich tun?
Peter Müller
2023-05-14 10:00:24 UTC
Permalink
Das Problem mit der URISyntaxException konnte durch ein Neustarten von
Ecipse behoben werden.
Patrick Roemer
2023-05-14 14:02:27 UTC
Permalink
Das ist eine sehr generische Fehlerbeschreibung. :)
Post by Peter Müller
URL url = MainWindow.class.getResource("InitializeAudio.mp3");
String fileName = url.toString();
audioClip = new javafx.scene.media.AudioClip(url.toString());
audioClip.play();
Das Folgeproblem scheint ja gelöst, aber eigentlich sollte das so tun.
Wenn dem nicht so ist, kann das an allem möglichen liegen: Falscher
Ressourcenpfad, Probleme mit Audio-Libs zwischen JRE und OS, usw.
Workarounds mit einer temporären Datei wären da nicht meine erste Wahl.
Peter Müller
2023-05-15 16:36:09 UTC
Permalink
Es gibt aber weiterhin Probleme.
Im Eclipse funktioniert new File(uri), in der Standalone Anwendung wird
aber diese Exception geworfen:
java.lang.IllegalArgumentException: URI is not hierarchical

Ich umgehe das Problem damit, dass ich die Datei im Filesystem abspeichere.
Peter Müller
2023-05-15 18:39:07 UTC
Permalink
Jetzt funktioniert es!

Die Lösung ist:

InputStream inputStream =
MainWindow.class.getResourceAsStream("InitializeAudio.mp3");

Was nicht funktioniert:

InputStream inputStream_geht_nicht_1 =
ClassLoader.getSystemResourceAsStream("InitializeAudio.mp3");
InputStream inputStream_geht_nicht_2 =
MainWindow.class.getClassLoader().getResourceAsStream("InitializeAudio.mp3");
Patrick Roemer
2023-05-16 12:49:18 UTC
Permalink
Post by Peter Müller
InputStream inputStream =
MainWindow.class.getResourceAsStream("InitializeAudio.mp3");
InputStream inputStream_geht_nicht_1 =
ClassLoader.getSystemResourceAsStream("InitializeAudio.mp3");
InputStream inputStream_geht_nicht_2 =
MainWindow.class.getClassLoader().getResourceAsStream("InitializeAudio.mp3");
"Funktioniert nicht" ist nie eine sinnvolle Fehlerbeschreibung. Wenn Du,
egal wo, wirklich Hilfe erhalten willst, solltest Du alle potentiellen
Informationen zur Verfügung stellen, hier etwa: Exception stack trace
oder Beschreibung des unerwarteten Verhaltens, Dateisystemlayout der
class path resources, etc.

Class#getResource[AsStream]() sucht bei einem relativen URL-"Pfad" (ohne
führenden Slash) die Ressource relativ zum Package-Pfad der Klasse.
ClassLoader#getResource[AsStream]() geht immer von einem absoluten Pfad aus.

https://www.baeldung.com/java-class-vs-classloader-getresource

Bei mir tut es problemlos mit getClass.getResource("/audio.mp3"), wenn
die Datei top level im class path liegt, und mit
getClass.getResource("audio.mp3"), wenn die Datei in einen Pfad analog
zur Package der Klasse liegt - kein Handstand mit temporären Dateien
notwendig.
Michael Paap
2023-05-16 13:25:04 UTC
Permalink
Post by Patrick Roemer
"Funktioniert nicht" ist nie eine sinnvolle Fehlerbeschreibung. Wenn Du,
egal wo, wirklich Hilfe erhalten willst, solltest Du alle potentiellen
Informationen zur Verfügung stellen, hier etwa: Exception stack trace
oder Beschreibung des unerwarteten Verhaltens, Dateisystemlayout der
class path resources, etc.
Ich habe das Thema hier mal ein wenig ausgeführt:
https://laeuftnicht.mpaap.de

:-)

Gruß
Michael
Peter Müller
2023-05-16 16:50:33 UTC
Permalink
Post by Patrick Roemer
Post by Peter Müller
InputStream inputStream_geht_nicht_1 =
ClassLoader.getSystemResourceAsStream("InitializeAudio.mp3");
InputStream inputStream_geht_nicht_2 =
MainWindow.class.getClassLoader().getResourceAsStream("InitializeAudio.mp3");
Die beiden Streams sind null.
Post by Patrick Roemer
"Funktioniert nicht" ist nie eine sinnvolle Fehlerbeschreibung. Wenn Du,
egal wo, wirklich Hilfe erhalten willst, solltest Du alle potentiellen
Informationen zur Verfügung stellen, hier etwa: Exception stack trace
oder Beschreibung des unerwarteten Verhaltens, Dateisystemlayout der
class path resources, etc.
Ich hatte ja geschrieben, dass es jetzt geht. Ich brauche keine Hilfe
mehr. Es war nur ein Info-Posting.
Post by Patrick Roemer
https://www.baeldung.com/java-class-vs-classloader-getresource
Bei mir tut es problemlos mit getClass.getResource("/audio.mp3"), wenn
die Datei top level im class path liegt, und mit
getClass.getResource("audio.mp3"), wenn die Datei in einen Pfad analog
zur Package der Klasse liegt - kein Handstand mit temporären Dateien
notwendig.
Auf welchen Objekt bzw. Klasse befindet ich die getClass-Methode?

Ich habe mehrere Varianten ausprobiert, aber es funktioniert nicht. Auch
nicht, wenn die Audio-Datei oben im Klassenpfad liegt.

Im Eclipse funktioniert

getInputFiles("InitializeAudio.mp3");
getInputFiles("./InitializeAudio.mp3");
getInputFiles("/InitializeAudio.mp3");

getInputFiles(String path) ist im wesentlichen

URL url = MainWindow.class.getResource(path);
URI uri = url.toURI();
File inputFile=new File(uri);

Loading...