如何从uri确定文件的文件扩展名 - java

假设给我一个URI,并且我想查找返回的文件的文件扩展名,那么在Java中该做什么。

例如,位于http://www.daml.org/2001/08/baseball/baseball-ont的文件是http://www.daml.org/2001/08/baseball/baseball-ont.owl

当我做

    URI uri = new URI(address); 
    URL url = uri.toURL();
    String file = url.getFile();
    System.out.println(file);

我无法看到带有.owl扩展名的完整文件名,只是/2001/08/baseball/baseball-ont我也如何获得文件扩展名。
``

参考方案

首先,我想确保您也知道不可能找到URI链接的文件,因为以.jpg结尾的链接可能会让您访问.exe文件(对于URL来说尤其如此,因为到符号链接和.htaccess文件),因此,如果您要限制允许的文件类型,那么从URI获取真正的扩展名并不是一个坚如磐石的解决方案。因此,我假设您只是想知道文件基于URI的扩展名,即使它不是完全值得信赖的。

您可以使用以下方法从任何URI,URL或文件路径获取扩展名。您不必使用任何库或扩展,因为这是Java的基本功能。此解决方案获取URI字符串中最后一个.(句点)符号的位置,并创建一个从句点符号的位置开始,到URI字符串的结尾结束的子字符串。

String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png";
String extension = uri.substring(uri.lastIndexOf("."));

上面的代码示例将从URI中的.png变量中输出extension扩展名,请注意,如果要收集不带前缀句点的文件扩展名,扩展名中将包含.(句点),将子字符串索引增加一个,如下所示:

String extension = uri.substring(url.lastIndexOf(".") + 1);

在正则表达式上使用此方法的一个专家(其他人经常使用的方法)是,这样可以节省大量资源,并且在执行相同结果的同时,可以减少执行繁重的工作。

此外,您可能要确保URL包含句点字符,请使用以下代码来实现:

String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png";
if(uri.contains(".")) {
    String extension = uri.substring(url.lastIndexOf("."));
}

您可能想要进一步改善功能,以创建一个更强大的系统。两个示例可能是:

通过检查URI是否存在或通过使用正则表达式确保URI的语法有效来验证URI。
修剪扩展名以删除不需要的空格。

我不会在这里介绍这两个功能的解决方案,因为这并不是一开始就要求的。

希望这可以帮助!

java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…

Java:从文件系统加载资源 - java

我的项目设定我有以下项目设置:\program.jar \images\logo.png 在我的代码中,我使用相对URL "images/logo.png"引用图像。问题如果我在目录中使用以下命令运行此程序:c:\projects\program_dir\bin\>java -jar program.jar 然后一切正常,Java能…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…