Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wie komme ich von einer URL zu einem Dateinamen?

8 views
Skip to first unread message

Peter Müller

unread,
May 12, 2023, 3:01:44 PM5/12/23
to
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

unread,
May 14, 2023, 6:02:39 AM5/14/23
to
Das Problem mit der URISyntaxException konnte durch ein Neustarten von
Ecipse behoben werden.

Patrick Roemer

unread,
May 14, 2023, 10:04:26 AM5/14/23
to
Responding to Peter Müller:
> Der folgende Code funktioniert nicht:

Das ist eine sehr generische Fehlerbeschreibung. :)

> 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

unread,
May 15, 2023, 12:36:15 PM5/15/23
to
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

unread,
May 15, 2023, 2:39:13 PM5/15/23
to
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

unread,
May 16, 2023, 8:50:39 AM5/16/23
to
Responding to Peter Müller:
"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

unread,
May 16, 2023, 9:44:03 AM5/16/23
to
Am 16.05.2023 um 14:49 schrieb 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

unread,
May 16, 2023, 12:52:03 PM5/16/23
to

>> 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.



Patrick Roemer schrieb:

>
> "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.


>
> 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);

0 new messages