プログラマメモ2 - programmer no memo2

URIでfileをみるとき/が一本たりないことに注意 2007/11/02
2008/01/20

非常にはまったのでメモ

環境

Windows上で、Cドライブの直下にtmpというディレクトリがありそこにtest.propというファイルがあります。


ブラウザ上で、URLを入力する欄に
file://c:/tmp/test.prop

といれるとファイルが開けます。

これをjavaで指定すると開くことができませんでした。
それで、ただしくは、
file:///c:/tmp/test.prop


ちなみに出てくる例外は以下

Exception in thread "main" java.net.UnknownHostException: c
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
at sun.net.NetworkClient.openServer(NetworkClient.java:118)
at sun.net.ftp.FtpClient.openServer(FtpClient.java:488)
at sun.net.ftp.FtpClient.openServer(FtpClient.java:475)
at sun.net.www.protocol.ftp.FtpURLConnection.connect(FtpURLConnection.java:270)
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:352)
at java.net.URL.openStream(URL.java:1009)
at prop.Test.main(Test.java:17)

FtpClientが動き出しています。

package prop;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Properties;

public class Test {

public static void main(String[] args) throws URISyntaxException,
IOException {

URI uri = new URI("file:///c:/tmp/test.prop");
URL url = uri.toURL();
InputStream stream = url.openStream();
Properties properties = new Properties();
properties.load(stream);
System.out.println(properties.get("test1"));

}

}


その他、参考
プログラマメモ2: [java]URIとURL

[java]URIとURL 2006/08/31
2008/01/20

java.net.URIクラスには toURLメソッドが用意されています。

ですが、java.net.URLクラスには、toURIメソッドがありません。



何故にそういう疑問をもつにいたったかといいますと、





URI は Uniform Resource Identifier であり、URL は Uniform Resource Locator です。したがって、抽象的に言えば、すべての URL は URI ですが、すべての URI が URL であるとはかぎりません。



javadoc1.4 日本語版 java.net.URIの説明より





という説明を読んで、単純にすべてのURLはURIなら、toURIメソッドをURLクラスがもっていてもいいのではないか、と思ったからです。



似たような疑問をもった方がいました。

http://www.teria.com/~koseki/emacswiki/FileUriUrl.html





相互変換は簡単にできます。

http://javaalmanac.com/egs/java.net/Url2Uri.html?l=rel



下記のコードは、http://javaalmanac.com/egs/java.net/Url2Uri.html?l=relで紹介されていたものです。



try {

url = uri.toURL();

} catch (IllegalArgumentException e) {

// URI was not absolute

} catch (MalformedURLException e) {

}



// Convert a URL to a URI

try {

uri = new URI(url.toString());

} catch (URISyntaxException e) {

}