An application I'm working on involves accessing files on network file shares, and we're using URIs to specify the files' locations.
My understanding of the file: URI is that they should take the form of file://
+path. In the case of a Windows network share, this path looks something like \\servername\dir\file
, so the resultant URI becomes file:////servername/dir/file
.
This seems to be working great for Java's URI class, but the Win32 API seems to want a file://servername/dir/file
style URI, which Java rejects because it "has an authority component".
Am I understanding network-share URIs correctly? Is there another way to specify a path without Java complaining about the authority?
Edit: We were hoping to be able to store paths as URIs, so as to make use of the scheme-part of the URI to specify other locations (e.g. file: versus other:). But as pointed out, it looks like Java may just have its own issues with URIs...
URLs with a double slash in the path can be generated by content management systems, plugins or broken HTML, and are often caused by issues with relative linking and/or the base URL.
A general path, which can be a filename or a URI . It can be either a filename or a URI .
A good way to remember the difference between a backslash and a forward slash is that a backslash leans backwards ( \ ), while a forward slash leans forward ( / ). In Windows, backslashes are used to separate directories in file paths (ex: C:\Program Files\Common Files\microsoft shared\).
Windows uses the backslash ( \ ) for the file system delimiter. For everything else the forward slash is used ( / ). The Uri type uses the forward slash because that is how a uniform resource identifier is defined.
It seems that Java is wrong:
Incorrect:
file:////applib/products/a%2Db/abc%5F9/4148.920a/media/start.swf
Correct:file://applib/products/a-b/abc_9/4148.920a/media/start.swf
On UNC paths in Java:
The URI class handles UNC paths reasonably well, but has some problems. In the Java class libraries, the string representation of a UNC path is as follows:
new File("//SERVER/some/path").toURI().toString() -> "file:////SERVER/some/path
In other words, the URI stores the entire UNC path in the path component of the URI, and leaves the server/authority component empty. As long as you consistently use this string representation you will be able to interact successfully with java.net.URI.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With