Ank*_*kur 18 java url uri file
假设我有一个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);
Run Code Online (Sandbox Code Playgroud)
我无法看到带.owl扩展名的完整文件名,/2001/08/baseball/baseball-ont我也是如何获得文件扩展名的.``
Tim*_*sée 58
首先,我想确保您知道找不到URI链接的文件类型是不可能的,因为以链接结尾.jpg可能允许您访问.exe文件(由于符号链接和.htaccess,这对URL来说尤其如此)因此,如果你想限制允许的文件类型,那么从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("."));
Run Code Online (Sandbox Code Playgroud)
上面的代码示例将从变量中.png的URI 输出扩展名extension,注意.扩展中包含(句点),如果要收集没有前缀句点的文件扩展名,请将子字符串索引增加1,如下所示:
String extension = uri.substring(url.lastIndexOf(".") + 1);
Run Code Online (Sandbox Code Playgroud)
在正则表达式(一种其他人经常使用的方法)上使用此方法的一个专业人员是,这种资源的资源要少得多,并且在给出相同结果的同时执行起来要轻得多.
此外,您可能希望确保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("."));
}
Run Code Online (Sandbox Code Playgroud)
您可能希望进一步改进功能以创建更强大的系统.两个例子可能是:
我不会在这里介绍这两个功能的解决方案,因为这不是首先要求的.
希望这可以帮助!
Ste*_*n C 14
这有两个答案.
如果URI没有"文件扩展名",那么您无法通过文本查看或将其转换为a来推断它File.通常,URI或文件都不需要具有扩展名.扩展只是一个文件命名约定.
你真正想要的是文件的媒体类型/ MIMEtype /内容类型.您可以通过执行以下操作来确定媒体类型:
URLConnection conn = url.connect();
String type = conn.getContentType();
Run Code Online (Sandbox Code Playgroud)
但是,如果服务器未在响应中设置内容类型,则该getContentType()方法将返回null.(或者它可能会给你错误的内容类型或非特定的内容类型.)那时,你需要诉诸内容类型"猜测",我不知道这是否会给你一个足够的特定内容输入这种情况.
但是,如果你"知道"该文件应该是OWL,那么你为什么不给它一个".owl"扩展呢?
此链接可能对那些仍然有问题的人有所帮助: 如何获取具有其Uri的文件的mime类型?
public static String getMimeType(Context context, Uri uri) {
String extension;
//Check uri format to avoid null
if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
//If scheme is a content
final MimeTypeMap mime = MimeTypeMap.getSingleton();
extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
} else {
//If scheme is a File
//This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());
}
return extension;
}
Run Code Online (Sandbox Code Playgroud)
接受的答案对于包含“?”的 url 没有用 或扩展名后的“/”。因此,要删除多余的字符串,您可以使用 getLastPathSegment() 方法。它只为您提供 uri 中的名称,然后您可以获得扩展名,如下所示:
String name = uri.getLastPathSegment();
//Here uri is your uri from which you want to get extension
String extension = name.substring(name.lastIndexOf("."));
Run Code Online (Sandbox Code Playgroud)
上面的代码使用 .(dot) 进行扩展,如果你想删除点,那么你可以编写如下代码:
String extension = name.substring(name.lastIndexOf(".") + 1);
Run Code Online (Sandbox Code Playgroud)
小智 5
URLConnection.guessContentTypeFromName(url)将在第一个答案中传递mime类型.也许你只是想要:
String extension = url.getPath().replaceFirst("^.*/[^/]*(\\.[^\\./]*|)$", "$1");
Run Code Online (Sandbox Code Playgroud)
正则表达式消耗所有直到最后一个斜杠,然后到达一个句点并返回一个类似".owl"或""的扩展名.(如果没有记错的话)