Übergeben Sie eine lokale Datei an die URL in Java

175

Wie erstelle ich ein neues URLObjekt mit einer lokalen Datei für Unit-Tests?

Inzwischen InHell
quelle

Antworten:

283
new File(path).toURI().toURL();
jarnbjo
quelle
21
Für Java 7+: Paths.get ("Pfad", "zu", "Zeug"). ToUri (). ToURL ()
Ajax
45

Verwenden von Java 7:

Paths.get(string).toUri().toURL();

Allerdings möchten Sie wahrscheinlich eine bekommen URI. ZB URIbeginnt ein mit, file:///aber eine URL mit file:/(zumindest ist es das, was toStringproduziert).

Aleksandr Dubinsky
quelle
"... ein URI beginnt mit file: ///, aber eine URL mit file: / ..." Ist das sowohl für Windows als auch für Linux der Fall?
Ptntialunrlsd
@ptntialunrlsd Das ist eine gute Frage. Ich habe nicht überprüft, aber ich würde ja raten.
Aleksandr Dubinsky
6
Nein. Eine URL ist nur ein Sonderfall einer URI. Ein Datei-URI beginnt mit "file: //" und listet dann den Host (im Allgemeinen weggelassen) auf, gefolgt von "/" und dem Pfad "foo / bar" (im Allgemeinen als absoluter Pfad zu lesen). Also "file: /// foo / var". Ein URI, der wie "file: / foo / bar" aussieht, ist falsch. Siehe auch: Datei-URI-Schema
David Tonhofer
@DavidTonhofer Vielen Dank für die Erklärung der URIs, aber das beantwortet die Frage von ptntialunrlsd nicht . Was produziert '... toURL (). ToString ()' unter Linux? Außerdem habe ich Ihre Änderungen rückgängig gemacht, weil sie meine Antwort wortreicher gemacht haben, ohne die Bedeutung zu ändern.
Aleksandr Dubinsky
3
@AleksandrDubinsky Es ist jedoch am besten, Zeiger auf das Oracle-Javadoc zu belassen java.nio.file.Paths. Stellen Sie außerdem sicher, dass Sie die Implementierungen in "URI vs URL" meinen . Anway java.net.URL.toString()produziert unter Unix dasselbe, wie es sein muss. Es wird nur ein "/" angezeigt, was sehr falsch ist (siehe Datei-URI-Schema ). Ich denke, dies ist in Java aus Gründen, besser zu nutzen java.net.URI. Bei einem Aufruf von wird "file: // [host] /" korrekt generiert .toString().
David Tonhofer
40
new File("path_to_file").toURI().toURL();
Ted Hopp
quelle
21
new URL("file:///your/file/here")
Alex
quelle
1
Wo /your/file/hereist ein absoluter Pfad zu einer Datei unter Unix / Linux. Unter Windows wäre das anders, denke ich.
Robin Green
5
Das ist nicht sehr klug, da Sie das Entkommen von Zeichen, die in URLs nicht erlaubt sind, selbst handhaben müssen. Unter Windows (und möglicherweise anderen Betriebssystemen) müssen Sie auch das Pfadtrennzeichen vom nativen Pfad zur Datei ändern.
Jarnbjo
new URL("file:my.properties");
Weberjn
Dies ist zwar korrekt, aber nicht portierbar, da es von absoluten Pfaden abhängt.
Mazunki
10
File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();
Sean Patrick Floyd
quelle
5

Schauen Sie sich hier die vollständige Syntax an: http://en.wikipedia.org/wiki/File_URI_scheme für Unix-ähnliche Systeme wird es so sein, wie @Alex sagte, file:///your/file/herewährend es für Windows-Systeme sein würdefile:///c|/path/to/file

Liv
quelle
7
Mach das nicht manuell. File.toURI().toURL()ist der richtige Weg
Sean Patrick Floyd
3
@ SeanPatrickFloyd Manchmal haben Sie keine Wahl, wie wenn es in einer .propertiesDatei ist.
Schlitten
@ArtB Ich sehe nicht, wie das einen Unterschied macht
Sean Patrick Floyd
2
@SeanPatrickFloyd, diese Frage / Antwort wird bei der Suche angezeigt. java file urlIn meinem Fall bedeutet dies, dass ich nach dem Format einer file://URL in Java gesucht habe , um sie in einer .propertiesDatei zu verwenden oder manuell
einzugeben
1
@ SeanPatrickFloyd Manchmal hat man keinen Zugriff auf den Quellcode, nur auf die Eigenschaft, und file://ist leider notwendig. Systemabhängigkeit ist kein so großes Problem, da es sich um eine veränderbare Eigenschaft handelt.
Wikingersteve
4

Sie können auch verwenden

[AnyClass].class.getResource(filePath)
xMichal
quelle
2
aber nur, wenn diese Datei im Klassenpfad existiert
aepurniet
1
Wenn der "filePath" in einem JAR gefunden wird, ist die resultierende URL wie folgt jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt.
David Tonhofer