如何确定从一个文件的文件扩展名
假设我给了一个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中获取real扩展名当然。所以,我假设你只是想知道文件基于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);
使用了正则表达式这种方法(该方法的其他人使用了大量的)一个亲的是,这是少了很多资源昂贵,而且少了很多重执行,同时给出相同的结果。
此外,您可能要确保网址中包含一段文字,可以使用下面的代码来实现这一目标:
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的语法有效(可能使用正则表达式)来验证URI。
- 修剪扩展程序以去除不需要的空白区域。
我不会在这里介绍这两个功能的解决方案,因为这不是第一个问到的问题。
希望这会有所帮助!
有两个答案。
如果URI没有“文件扩展名”,那么通过文本查看或将其转换为File
无法推断出该文件。一般来说,URI或文件都不需要扩展。扩展名仅仅是一个文件,命名为约定。
你真正想要的是文件的媒体类型/ MIMEtype /内容类型。您可以通过做这样的事情,以确定媒体类型:
URLConnection conn = url.connect();
String type = conn.getContentType();
然而getContentType()
方法将返回null
如果服务器没有设置响应的内容类型。 (或者它可能会给你错误的内容类型或非特定的内容类型。)在这一点上,你需要诉诸内容类型“猜测”,我不知道这是否会给你一个足够具体的在这种情况下键入。
但是如果你“知道”应该是是OWL,为什么不直接给它一个“.owl”扩展?
URLConnection.guessContentTypeFromName(url)
将在第一个答案中提供MIME类型。 也许你只是想:
String extension = url.getPath().replaceFirst("^.*/[^/]*(\\.[^\\./]*|)$", "$1");
的正则表达式所有消耗高达最后一个斜线,接着一边一段时间,要么返回类似“.owl”或‘’的延伸。 (如果没记错)
“$ 1”意味着什么?请解释... – artapart 2013-11-25 12:07:31
@JavaRocks - 阅读javadocs :-) – 2015-05-25 12:11:30
URLConnection.guessContentTypeFromName(地址)//(字符串地址)是最佳答案imho。 – 2015-07-08 15:18:03
此链接可能有助于为那些谁仍然有问题: How I can get the mime type of a file having its Uri?
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;
}
不适合我 – 2018-02-08 08:15:42
我这样做。
你可以用更多的验证检查所有文件的扩展名:
String stringUri = uri.toString();
String fileFormat = "png";
if (stringUri.contains(".") && fileFormat.equalsIgnoreCase(stringUri.substring(stringUri.lastIndexOf(".") + 1))) {
// do anything
} else {
// invalid file
}
至于其他的答案已经解释过,你真的不知道的内容类型,而不检查文件。但是,您可以从URL中预测文件类型。
Java 差不多作为URL
类的一部分提供此功能。 URL::getFile
会智能抢URL
的文件部分的方法:
final URL url = new URL("http://www.example.com/a/b/c/stuff.zip?u=1");
final String file = url.getFile(); // file = "https://stackoverflow.com/a/b/c/stuff.zip?u=1"
我们可以用它来写我们的实现:
public static Optional<String> getFileExtension(final URL url) {
Objects.requireNonNull(url, "url is null");
final String file = url.getFile();
if (file.contains(".")) {
final String sub = file.substring(file.lastIndexOf('.') + 1);
if (sub.length() == 0) {
return Optional.empty();
}
if (sub.contains("?")) {
return Optional.of(sub.substring(0, sub.indexOf('?')));
}
return Optional.of(sub);
}
return Optional.empty();
}
此实现应处理边缘案件正确:
assertEquals(
Optional.of("zip"),
getFileExtension(new URL("http://www.example.com/stuff.zip")));
assertEquals(
Optional.of("zip"),
getFileExtension(new URL("http://www.example.com/stuff.zip")));
assertEquals(
Optional.of("zip"),
getFileExtension(new URL("http://www.example.com/a/b/c/stuff.zip")));
assertEquals(
Optional.empty(),
getFileExtension(new URL("http://www.example.com")));
assertEquals(
Optional.empty(),
getFileExtension(new URL("http://www.example.com/")));
assertEquals(
Optional.empty(),
getFileExtension(new URL("http://www.example.com/.")));
如果URL在文件名或散列之后有一个问号,这将不起作用。 – 2015-07-08 14:44:50
您添加的那段时间字符检查不会做任何非常有用的事情,因为无论如何都有一段时间在顶级域名之前。 – 2017-02-17 15:37:01