Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中查找URI对应的协议_Java_Url_Uri_Inputstream - Fatal编程技术网

在Java中查找URI对应的协议

在Java中查找URI对应的协议,java,url,uri,inputstream,Java,Url,Uri,Inputstream,我有Java中的URI对象。我想将其转换为InputStream,但转换应取决于协议。如果我的URI是http://somepath.com/mysuperfile.xsl: return myURI.toURL().openConnection().getInputStream(); return new FileInputStream(Paths.get(myURI).toFile()); 如果我的uri是file:///somepath/mysuperfile.xsl: return

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

return myURI.toURL().openConnection().getInputStream();
return new FileInputStream(Paths.get(myURI).toFile());
如果我的uri是
file:///somepath/mysuperfile.xsl

return myURI.toURL().openConnection().getInputStream();
return new FileInputStream(Paths.get(myURI).toFile());

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

您可以使用startsWith(string prefix)函数检查字符串开头的字符,它是www.或http://使用第一种方法,否则使用第二种方法。

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

URIReadTest.java 在系统上制作一个
/tmp/test.txt
,编译和运行上述代码时,您将看到打印出来的内容

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

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

如果您想要的是scheme名称(大致翻译成protocol),只需使用

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

,如果您只想生成一个
输入流
,而不区分方案,只需使用

return myURI.toURL().openStream();


(正如您对HTTP协议/方案所做的那样)

不需要特殊情况的方案。有关详细信息,请参阅。在某些情况下,方案案例是必要的。有关详细信息,请参阅我对您答案的评论。问题并不是询问这些情况中的任何一种。发布的代码表明手头的任务正在读取文件。OP可能认为不同的协议需要不同的处理,但事实并非如此。Java提供了一个API,成功地将其抽象出来。首先,我不喜欢“印象”,因为我是程序员,不是印象派。我也不喜欢“建议”,因为我的理由。如果OP知道他在问什么,他会得到答案的。时期如果他没有,他必须首先承认;我不会凭空假设那是真的。如果有问题,我会回答。Ockham的razor是个好主意,但在我看来,尊重原始海报的问题更好。而且——如果Java的API抽象成功,这个特殊(“文件”方案使用)案例会有错误报告吗?是的,出于安全原因,他们有“bug无法修复”。这是否证明了抽象是成功的,或者说它本身存在缺陷,但在可接受的范围内?“不支持文件的URL使得不可能透明地使用URL来存储可能在web服务器、FTP服务器或本地文件系统中的数据。”-这不是我的观点,但是的,这非常准确。使用object==failed abstractions时没有透明度有时需要根据URI/URL方案区分操作。这正是OP所问的。“我知道如何将其转换为InputStream。但转换取决于协议。”这是他的要求,而不是我的想法。如果这取决于协议,则需要引入代码分支的区分。你想说这永远不会发生吗?是的,有一种情况,只与这个问题部分相关(但仍然如此),当这个问题很重要时,就是你想实际写入一个文件。是否尝试从openConnection()写入文件://流?“线程中的异常”main“java.net.UnknownServiceException:protocol不支持输出”-当我在自己的代码中进行方案区分时就是这种情况。它就像一个符咒;您可以写入ftp和http方案,但要写入文件,实际上必须将其作为文件打开,而不是文件://-Oracle上甚至有一个关于它的bug,但它是按设计(安全性)打开的AFAIR@vaxquis当前位置我对这个问题的解释与你的不同。OP想要做的就是从URL中读取。OP显然认为处理文件URI需要特殊处理。但事实并非如此。至于您的其他注释,
openConnection()
返回一个
InputStream
,无论方案是什么,您都无法对其进行写入。无论如何,这个问题没有提到写作,只提到阅读;只是,只要OP不评论他的需求,我就坚持最保守的解释。如果有人要一个汉堡包,我不会去给他一条鱼;我知道汉堡包可能对他的健康有害,但这是他的决定,不是我的。这是他的问题,这就是我的答案。我不是通灵师,他要的是XYZZY,他要的是XYZY。。。。只是开头没有细绳。您必须首先调用myURI.toString(),这大致就是系统调用myURI.getScheme()所做的。