ChatGPT解决这个技术问题 Extra ChatGPT

将本地文件传递到 Java 中的 URL

如何使用本地文件创建新的 URL 对象以进行单元测试?


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

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

使用 Java 11:

Path.of(string).toUri();

使用 Java 7:

Paths.get(string).toUri();

要转换为老式 URL 类(为什么?),请添加 .toURL()。请注意,字符串输出存在差异。现代的 URI::toStringfile:///(传统的 URL 语法)开头,而几乎弃用的 URL::toStringfile:/(现代的 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]/”。
T
Ted Hopp
new File("path_to_file").toURI().toURL();

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

其中 /your/file/here 是 Unix/Linux 上文件的绝对路径。我认为在 Windows 上会有所不同。
这不是很聪明,因为您必须自己处理 URL 中不允许的字符的转义。在 Windows(以及可能的其他操作系统)上,您还必须修改从本机路径到文件的路径分隔符。
new URL("file:my.properties");
虽然这是正确的,但它不是可移植的,因为它依赖于绝对路径。
在 Windows 上,以下对我有用:file:///C:\\file.zip
S
Sean Patrick Floyd
File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();

L
Liv

在这里查看完整的语法: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:// 是必要的。依赖于系统并不是一个大问题,因为它是一个可变属性。
x
xMichal

你也可以使用

[AnyClass].class.getResource(filePath)

但前提是该文件存在于类路径中
如果可以在 jar 中找到“filePath”,则生成的 URL 类似于 jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt
S
SzB

我在 Linux 上使用 Java 进行了尝试。以下可能性是可以的:

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

不工作是:

file://aaaa.html