我有一个简单的问题,我很挣扎。我在目录中有几个文件,我正在阅读它们并根据它们的类型(扩展名)传递处理它们。但是,作为输入,我收到一个没有扩展名的文件路径,所以我必须自己识别该类型。
示例(文件):
files/file1.txt
files/file1.txt
files/pic1.jpg
----------------
String path = "files/file1";
String ext = FilenameUtils.getExtension(path); // this returns null
当扩展名未包含在路径中时,有没有办法识别文件类型?
答案 0 :(得分:2)
你最好的选择是"自己做"通过实施FileTypeDetector
s。
如果有了此功能,则可以使用Files.probeContentType()
返回一个字符串,该字符串将文件内容描述为MIME类型。
JDK确实提供了默认实现,但它基本上依赖于文件扩展名。如果你有一个名为foo.txt
的PNG图像,默认实现将返回text/plain
,其中文件实际上是image/png
。
这当然是错误的。
最后注意事项:如果您真正拥有的只是文件名的一部分,请使用Files.newDirectoryStream()
并为其提供相应的DirectoryStream.Filter<Path>
。不确定为什么你只有部分。
答案 1 :(得分:1)
由于您只提供了部分文件名,因此您需要搜索以该前缀开头的文件。请注意,可能有多个匹配。
使用java.nio.file
Path prefix = Paths.get(path);
Path directory = prefix.getParent();
try (Stream<Path> stream = Files.list(directory)) {
stream.filter(p -> p.getFileName().startsWith(prefix.getFileName() + "."))
.forEach(p -> System.out.printf("Found %s%n", p));
}
使用java.io
File prefix = new File(path);
File directory = prefix.getParentFile();
List<File> matches = directory.listFiles((dir, name) ->
name.startsWith(prefix.getName() + "."));
for (File match: matches) {
System.out.printf("Found %s%n", match);
}
答案 2 :(得分:0)
Files.probeContentType(Path)
实现了您可以使用(或扩展)的基本MIME类型查询,其内部详细信息是特定于平台的。您还可以创建一个实用程序方法来遍历一组扩展。根据您的应用,可能需要两种方法的组合。
MIME类型检查器将在JRE的不同版本实现上提供不同的结果。所以,总是有一个故障转移解决方案。
[编辑]
这实际上没有回答所提出的问题,因为这种方法需要一个完整的,合法的Path
对象来处理。如果您只获得了主干名称,并且缺少扩展名,那么您既没有可以使用的扩展名,也没有Path
的有效Files
名称可以使用[和probeContentType()可以,一些实现,无论如何都只使用扩展。]
如果没有指向JRE可以访问的真实磁盘文件的路径,或者如果您没有扩展名,则我不确定如何执行此操作。如果您没有某种类型的文件,您甚至无法自己打开它来尝试文件类型&#34; magic&#34;。