将字符串转换为URI

5

如何将字符串www.mywebsite.com/firefox.txt转换为URL?我想在文件对象中使用它,然后传递给FileReader构造函数。


你的目标是什么?你想要那个URL的内容作为一个字符串吗?将URI(而不是URL)弄成一个文件以传递给FileReader是行不通的,因为该类只能读取文件(以file://开头的URI),而不能读取网页http://)。 - Philipp Reichart
@ Philipp Reichart 我想使用 FileWriter 在我的服务器上更改文件的内容(在使用 applet 时)。 - program-o-steve
大多数回答您的问题都假定您只想读取内容--使用FileWriter无法将内容写入远程位置(文件是本地的),我建议您为此提出一个新问题。 - Philipp Reichart
可能是将字符串转换为Uri的重复问题。 - james.garriss
5个回答

4
你可以使用 new URI(string)构造函数(用于URI)和new URL(string)构造函数(用于URL)。
但是这对于一个FileReader不起作用——它需要URI方案为file:
如果你想读取远程文件,你需要使用类似这样的东西:
Reader reader = new InputStreamReader(new URL(urlString).openStream(), encoding);

编码可以从通过url.openConnection()获得的HttpURLConnection中获取,但如果您事先知道它,也可以将其设置为特定内容。(顺便说一下,在上面的示例中,我省略了所有I/O资源管理)

注意(感谢@StephenC):url字符串必须是有效的URL,这意味着它必须以http://开头。


+1 猜测 OP 真正想要的内容,但这仍然忽略了服务器发送的任何内容编码。 - Philipp Reichart
是的,当使用 InputStreamReader 时,我总是设置编码,但当我给出示例时,我总是忘记 :) - Bozho
Java在一侧,服务器在另一侧,HTTP是一种协议。你需要一个不同的协议。例如FTP。 - Bozho
@ Bozho 如果我使用FTP,我能否使用FileReader和FileWriter在远程服务器上托管的文件上进行写入? - program-o-steve
不行,你必须使用完全不同的库。 - Bozho
那么 JDK 的 IO 库只能用于将文件写入/读取系统吗? - program-o-steve

1

如果你的目标是将该字符串(以及类似的字符串)转换为语法上有效的URL,就像典型浏览器的URL栏一样,那么答案是“使用启发式算法”。

具体来说,您需要找出哪些启发式算法最有可能将用户的输入转换为用户想要的URL。然后编写一些代码来实现它们。我建议从使用您喜欢的浏览器并尝试弄清楚它在做什么开始。


你的评论不太清楚,但我认为你是在说这个字符串是本地文件名,你想将它变成"file:" URL。

File file = new File("www.mywebsite.com/firefox.txt");
URL url = file.toURI().toURL();

如果你想要写入一个远程文件,你不能简单地使用URL对象和openStream()。写入由URL标识的远程资源通常需要http或ftp URL,并使用实现相应协议栈的库。

同样,你不能使用FileWriter API来完成这个任务...除非文件存在于已经挂载的文件系统中;例如作为Windows网络共享。FileWriter API仅适用于本地操作系统向你的应用程序提供的统一“文件系统”中的文件。

最后,我们回到了一个事实,那就是你需要使用有效的URL...而不是大多数用户在浏览器的URL栏中输入的语法无效的胡言乱语。


我想使用FileWriter在我的服务器上更改文件的内容(当使用applet时)。而托管文件的地址是一个字符串,因此我想将其更改为url / uri。 - program-o-steve

0
如果您的意思是需要将该字符串转换为URL字符串,您可以使用URLEncoder类以Url格式解码/编码字符串。
例如:
String encodedurlStr = URLEncoder.encode(url.toString(),"UTF-8"); 

如果您需要获取URL类型,则下面的答案是正确的(使用URL类构造函数)。

0

使用 new URL("--在此处输入你的URL--") 应该可以将其转换为一个URL,然而 File 构造函数接受的是 uri 而不是 url,因此...

try {
    URL url = new URL("--your url here--");
    File f = new File( url.toURI() );
    FileReader reader = new FileReader(f);
} catch (MalformedURL...IOException e.t.c.) { }

然而,要获取URL的内容,你可能想要尝试

new URL("--your url here--").openStream();

也许可以将其包装在一个类似于InputStreamReader的对象中;

new InputStreamReader( new URL("--your url here--").openStream() );

我没有尝试过这个,但我认为它应该是可行的 :)

对于那些不太聪明的人来说,可能会感到惊讶,--在此处输入您自己的url-- 意味着你需要填写你自己的网址。


1
这个应该行不通。URL构造器需要一个语法上有效的URL字符串...而那个字符串语法上不正确。 - Stephen C
哇,你真的很小气,以后不会再试图帮助任何人了。我没有添加协议,因为提问者没有添加,我认为他们应该知道它是什么。别担心,我不会再试图帮助任何人了。 - default_avatar
@RichardJohnson - 实际上,我认为OP想要的是将那样的(非URL)字符串转换为有效的URL的东西。 - Stephen C
@PhilippReichart 抱歉,今天心情不好。如果 OP 想要的话,也许他可以使用 Httpclient,你们觉得呢? - default_avatar
实际上,OP想要使用FileWriter在他的服务器上更改文件内容(当使用applet时)。这是从他在问题评论中提到的。因此,我们都猜对了方向(获取内容),但还没有猜到足够远(写入内容);) - Philipp Reichart
显示剩余2条评论

0

如果您想读取像http://www.mywebsite.com/firefox.txt这样的URL内容,即使您将URL(或URI)弄成java.io.FileFileReader也无法帮助您。

使用URL.openStream()InputStreamReader将获取URL的字符串内容,但可能会因为忽略服务器发送的内容编码而混乱。

我建议使用Apache HttpClient和类似以下的东西:

String url = "http://www.mywebsite.com/firefox.txt";

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(new HttpGet(url));
String contents = EntityUtils.toString(response.getEntity());

对于纯文本文件,这应该可以让您获取内容而不会出现任何编码问题。(HTML 文件可以使用元标记指定其编码,但无法使用 HTTP 客户端处理 100% 的情况)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接