将本地文件传递到 Java 中的 URL
Posted
技术标签:
【中文标题】将本地文件传递到 Java 中的 URL【英文标题】:Pass a local file in to URL in Java 【发布时间】:2011-08-31 04:56:55 【问题描述】:如何使用本地文件创建一个新的URL
对象以进行单元测试?
【问题讨论】:
【参考方案1】:使用 Java 11:
Path.of(string).toUri();
使用 Java 7:
Paths.get(string).toUri();
要转换为老式 URL 类(为什么?),请添加 .toURL()
。请注意,字符串输出存在差异。现代的URI::toString
以file:///
(传统的URL 语法)开头,而几乎被弃用的URL::toString
以file:/
(现代的URI 语法)开头。奇怪?
【讨论】:
"...URI 以 file:/// 开头,但 URL 以 file:/ ..." Windows 和 Linux 都是这种情况吗? @ptntialunrlsd 这是个好问题。我还没有检查,但我猜是的。 没有。 URL 只是 URI 的一种特殊情况。文件 URI 以“file://”开头,然后列出主机(通常省略),然后是“/”和路径“foo/bar”(通常意味着作为绝对路径读取)。因此“file:///foo/var”。看起来像“file:/foo/bar”的 URI 不正确。另见:file URI scheme @DavidTonhofer 感谢您对 URI 的解释,但这并不能回答 ptntialunrlsd 的问题。 '...toURL().toString()' 在 Linux 上产生什么?另外,我已恢复您的编辑,因为它们使我的回答更加冗长而没有改变含义。 @AleksandrDubinsky 不过,最好将指向 Oracle javadoc 的指针留在其中.. 更容易点击进入java.nio.file.Paths
。另外,请务必明确您的意思是“URI vs URL”中的实现。 Anway java.net.URL.toString()
在 Unix 上产生同样的东西,因为它必须。它只显示一个非常错误的“/”(参见file URI scheme)。我想这是在 Java 中的原因,最好使用java.net.URI
。它在调用.toString()
时正确生成“file://[host]/”。【参考方案2】:
我在 Linux 上使用 Java 进行了尝试。下列可能性是可以的:
file:///home/userId/aaaa.html
file:/home/userId/aaaa.html
file:aaaa.html (if current directory is /home/userId)
不工作是:
file://aaaa.html
【讨论】:
【参考方案3】:你也可以使用
[AnyClass].class.getResource(filePath)
【讨论】:
但前提是该文件存在于类路径中 如果可以在 jar 中找到“filePath”,则生成的 URL 类似于jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt
。【参考方案4】:
new File(path).toURI().toURL();
【讨论】:
对于 java 7+:Paths.get("path","to","stuff").toUri().toURL()【参考方案5】:File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();
【讨论】:
【参考方案6】:在这里查看完整的语法:http://en.wikipedia.org/wiki/File_URI_scheme
对于类 unix 的系统,它将是 @Alex 所说的 file:///your/file/here
,而对于 Windows 系统,它将是 file:///c|/path/to/file
【讨论】:
不要手动操作。File.toURI().toURL()
是要走的路
@SeanPatrickFloyd 有时您别无选择,例如在 .properties
文件中时。
@ArtB 我不明白这有什么不同
@SeanPatrickFloyd,当您搜索 java file url
时会出现此问题/答案,在我的情况下,这意味着我正在搜索 file://
URL 的格式,用 Java 编写,用于.properties
文件,或手动输入等。
@SeanPatrickFloyd 有时您无权访问源代码,只能访问属性,很遗憾,file://
是必要的。依赖于系统并不是一个大问题,因为它是一个可变属性。【参考方案7】:
new File("path_to_file").toURI().toURL();
【讨论】:
【参考方案8】:new URL("file:///your/file/here")
【讨论】:
其中/your/file/here
是 Unix/Linux 上文件的绝对路径。我认为在 Windows 上会有所不同。
这不是很聪明,因为您必须自己处理 URL 中不允许的字符的转义。在 Windows(以及可能的其他操作系统)上,您还必须将路径分隔符从文件的本机路径修改为。
new URL("file:my.properties");
虽然这是正确的,但它是不可移植的,因为它依赖于绝对路径。
在 Windows 上,以下对我有用:file:///C:\\file.zip
以上是关于将本地文件传递到 Java 中的 URL的主要内容,如果未能解决你的问题,请参考以下文章