File.toURL()
的默认输出为
file:/c:/foo/bar
这些似乎不适用于Windows,需要更改为
file:///c:/foo/bar
格式是否
file:/foo/bar
在Unix上正常工作(我没有要测试的Unix机器)?是否有一个库可以处理从当前环境格式正确的文件生成URL?
我考虑使用正则表达式来解决问题,例如:
fileUrl.replaceFirst("^file:/", "file:///")
但是,这不太对,因为它会转换正确的URL,如:
file:///c:/foo/bar
为:
file://///c:/foo/bar
更新
我正在使用Java 1.4,并且此版本File.toURL()
未被弃用,File.toURL().toString()
和File.toURI().toString()
在Windows上生成相同(不正确)的网址
答案 0 :(得分:12)
File(String)
需要路径名,而不是网址。如果您想根据实际代表网址的File
构建String
,那么您需要首先将此String
转换回URL
并使用File(URI)
根据URL#toURI()
构建File
。
String urlAsString = "file:/c:/foo/bar";
URL url = new URL(urlAsString);
File file = new File(url.toURI());
更新,因为你使用的是Java 1.4而且URL#toURI()
实际上是一个Java 1.5方法(对不起,忽略了那一点),更好地使用URL#getPath()
而不是返回路径名,以便您可以使用File(String)
。
String urlAsString = "file:/c:/foo/bar";
URL url = new URL(urlAsString);
File file = new File(url.getPath());
答案 1 :(得分:5)
不推荐使用File.toURL()方法 - 建议您改用toURI()方法。如果你改用它,你的问题会消失吗?
编辑:
我理解:您使用的是Java 4.但是,您的问题没有解释您尝试做什么。如果您在评论中说明,您试图只是阅读文件,请使用FileReader(如果文件是二进制格式,则使用FileInputStream)。
答案 2 :(得分:1)
你真正的意思是“格式file:/c:/foo/bar
在Unix上是否正常工作”?
Unix的一些例子。
File file = new File("/tmp/foo.txt"); // this file exists
System.out.println(file.toURI()); // "file:/tmp/foo.txt"
然而,你不能,例如这样做:
File file = new File("file:/tmp/foo.txt");
System.out.println(file.exists()); // false
(如果您需要URL
个实例,请file.toURI().toURL()
作为Javadoc says。
修改:以下内容如何,有帮助吗?
URL url = new URL("file:/tmp/foo.txt");
System.out.println(url.getFile()); // "/tmp/foo.txt"
File file = new File(url.getFile());
System.out.println(file.exists()); // true
(基本上非常接近使用new File(url.toURI())
的BalusC的例子。)