ChatGPT解决这个技术问题 Extra ChatGPT

Pass a local file in to URL in Java

How do I create a new URL object using a local file, for the purpose of unit tests?


T
Tim Cooper
new File(path).toURI().toURL();

For java 7+: Paths.get("path","to","stuff").toUri().toURL()
A
Aleksandr Dubinsky

Using Java 11:

Path.of(string).toUri();

Using Java 7:

Paths.get(string).toUri();

To convert to the old-school URL class (why?), add .toURL(). Note there is a difference in the string output. The modern URI::toString begins with file:/// (the traditional URL syntax) while the nearly-deprecated URL::toString with file:/ (the modern URI syntax). Weird 🤷


"...a URI begins with file:/// but a URL with file:/ ..." Is that the case for both Windows and Linux?
@ptntialunrlsd That is a good question. I haven't checked, but I would guess yes.
No. An URL is just a special case of an URI. A file URI starts with "file://" and then lists the host (generally omitted), followed by "/" and the path "foo/bar" (generally meant to be read as an absolute path). Thus "file:///foo/var". An URI that looks like "file:/foo/bar" is incorrect. See also: file URI scheme
@DavidTonhofer Thank you for the explanation of URIs, but that doesn't answer ptntialunrlsd's question. What does '...toURL().toString()' produce on Linux? Also, I've reverted your edits because they made my answer more wordy without changing the meaning.
@AleksandrDubinsky It's best to leave pointers to the Oracle javadoc in though.. easier to click through to java.nio.file.Paths. Also, please be sure to make clear that you mean the implementations in "URI vs URL". Anway java.net.URL.toString() produces the same thing on Unix, as it must. It only displays one "/" which is very wrong (see file URI scheme). I guess this is in Java because of reasons, better use java.net.URI. It correctly generates "file://[host]/" on a call to .toString().
T
Ted Hopp
new File("path_to_file").toURI().toURL();

A
Alex
new URL("file:///your/file/here")

where /your/file/here is an absolute path to a file on Unix/Linux. On Windows it would be different I think.
That's not very clever, since you have to handle the escaping of characters which are not allowed in URLs yourself. On Windows (and potentially other operating systems), you also have to modify the path separator from the native path to the file.
new URL("file:my.properties");
While this is correct, it is not portable as it depends on absolute paths.
On Windows the following worked for me: file:///C:\\file.zip
S
Sean Patrick Floyd
File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();

L
Liv

have a look here for the full syntax: http://en.wikipedia.org/wiki/File_URI_scheme for unix-like systems it will be as @Alex said file:///your/file/here whereas for Windows systems would be file:///c|/path/to/file


Don't do that manually. File.toURI().toURL()is the way to go
@SeanPatrickFloyd sometimes you don't have a choice, like when it is in a .properties file.
@ArtB I don't see how that makes a difference
@SeanPatrickFloyd, this question/answer comes up when you search for java file url, which in my case means that I was searching for the format of a file:// URL, in Java, for use in a .properties file, or to type in manually, etc.
@SeanPatrickFloyd sometimes you don't have access to the source code, just to the property, and file:// is unfortunately necessary. Being system dependent is not such a huge issue since it's a mutable property.
x
xMichal

You can also use

[AnyClass].class.getResource(filePath)

but only if that file exists within the classpath
If the "filePath" can be found in a jar, the resulting URL is like jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt.
S
SzB

I tried it with Java on Linux. The following possibilities are OK:

file:///home/userId/aaaa.html
file:/home/userId/aaaa.html
file:aaaa.html  (if current directory is /home/userId)

not working is:

file://aaaa.html