211

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

9 Answers 9

341
new File(path).toURI().toURL();
Sign up to request clarification or add additional context in comments.

1 Comment

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

NIO.2 in modern Java

Java I/O improved dramatically with the arrival of NIO and NIO.2. See guide by Oracle. See Wikipedia.

Using Path.of in Java 11 and later:

Path.of(string).toUri();

Or in earlier Java use Paths.get.

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 🤷

6 Comments

"...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().
|
43
new File("path_to_file").toURI().toURL();

Comments

23
new URL("file:///your/file/here")

4 Comments

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.
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
10
File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();

Comments

5

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

5 Comments

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

You can also use

[AnyClass].class.getResource(filePath)

2 Comments

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

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

Comments

0

For Windows: You have use in this way if file is in some drive:

eg.:

Actual link:

"C:\Users\er2\Downloads\Designer3.png"

Converted link:

"file:/C:/Users/er2/Downloads/Designer3.png"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.