12

我在 Java 中有 URI 对象。我想将其转换为 InputStream,但转换应取决于协议。如果我的 URI 是,我可以这样做http://somepath.com/mysuperfile.xsl

return myURI.toURL().openConnection().getInputStream();

或者如果我的uri是这样的file:///somepath/mysuperfile.xsl

return new FileInputStream(Paths.get(myURI).toFile());

或者甚至是另一种方式。我可以尝试手动检查它,但是 Java 是否有一些很好/正确的方法来检查它,也许使用那个新java.nio.*包?

4

3 回答 3

21

每个 URI 被定义为由四个部分组成,如下所示:

[scheme name] : [hierarchical part] [[ ? query ]] [[ # fragment ]]

如果您想要的是方案名称(大致翻译为协议),只需使用

switch ( myURI.getScheme() ) {
  case "http":
    return myURI.toURL().openConnection().getInputStream();
  case "ftp":
    // do something   
  case "file":
    return new FileInputStream( Paths.get(myURI).toFile() );
}

http://docs.oracle.com/javase/6/docs/api/java/net/URI.html#getScheme%28%29

或者,如果您只想生成一个InputStream 而不区分方案,只需使用

return myURI.toURL().openStream();

或者

return myURI.toURL().openConnection().getInputStream();

(就像你已经为 HTTP 协议/方案所做的那样)

于 2013-10-17T15:26:59.863 回答
1

无需特殊情况下的文件 URI。相同的代码适用于任何一种情况。我刚刚用下面的小程序测试了它:

URIReadTest.java

import java.io.*;
import java.net.*;

public class URIReadTest {
    public static void main(String[] args) throws Exception {
        URI uri = new URI("file:///tmp/test.txt");
        InputStream in = uri.toURL().openConnection().getInputStream();
        // or, more concisely:
        // InputStream in = uri.toURL().openStream();
        int b;
        while((b = in.read()) != -1) {
            System.out.print((char) b);
        }
        in.close();
    }
}

在你的系统上创建一个/tmp/test.txt,当你编译和运行上面的代码时,你会看到它的内容打印出来。

于 2013-10-17T15:24:37.587 回答
-1

you can check the characters at the start of the string with the startsWith(String prefix) function, it is www. or http:// use the first method otherwise use the second method.

于 2013-10-17T15:22:37.037 回答