Java 根据文件的干名称标识文件的扩展名

Java 根据文件的干名称标识文件的扩展名,java,file,Java,File,我有一个简单的问题,我很挣扎。我在一个目录中有几个文件,我正在读取它们,并根据它们的类型(扩展名)对它们进行处理。但是,作为一个输入,我接收到一个没有扩展名的文件路径,因此我必须自己识别类型 示例(文件): 当扩展名未包含在路径中时,是否有方法标识文件类型?您最好的选择是通过实现的实例“自己动手” 当您有了这个,您就可以使用返回一个字符串,该字符串将文件内容描述为MIME类型 JDK确实提供了一个默认实现,但它基本上依赖于文件扩展名;如果您有一个名为foo.txt的PNG图像,默认实现将返回t

我有一个简单的问题,我很挣扎。我在一个目录中有几个文件,我正在读取它们,并根据它们的类型(扩展名)对它们进行处理。但是,作为一个输入,我接收到一个没有扩展名的文件路径,因此我必须自己识别类型

示例(文件):

当扩展名未包含在路径中时,是否有方法标识文件类型?

您最好的选择是通过实现的实例“自己动手”

当您有了这个,您就可以使用返回一个字符串,该字符串将文件内容描述为MIME类型


JDK确实提供了一个默认实现,但它基本上依赖于文件扩展名;如果您有一个名为
foo.txt
的PNG图像,默认实现将返回
text/plain
,其中文件实际上是
图像/PNG

这当然是错误的



最后一点注意:如果您真正拥有的只是文件名的一部分,那么请使用
Files.newDirectoryStream()
并为其提供相应的
DirectoryStream.Filter
。但还不清楚为什么您只有部分文件。

文件。probeContentType(路径)
实现了一个基本的MIME类型查询,您可以使用(或扩展),其内部详细信息是特定于平台的。您还可以创建一个小的实用方法来遍历一组扩展。这两种方法的组合可能是必要的,具体取决于您的应用程序

MIME类型检查器将在JRE的不同版本实现上给出不同的结果。因此,始终有一个故障转移解决方案

见:

[编辑]

这实际上并不能回答所提出的问题,因为这种方法需要一个完整的合法路径。如果只提供了干名称,而扩展名丢失,则您既没有可使用的扩展名,也没有可使用的
文件的有效
路径
名称[在某些实现中,probeContentType()可能只使用扩展名。]


我不确定如果没有指向JRE可以访问的真实磁盘文件的路径,或者如果没有扩展名,则手动访问,您如何才能做到这一点。如果您没有某种类型的文件,您甚至无法自己打开它来尝试文件类型“magic”。

因为您只获得了部分文件名,所以您需要搜索以该前缀开头的文件。请注意,可能存在多个匹配项

使用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));
}
Path prefix=Path.get(Path);
Path directory=prefix.getParent();
try(Stream=Files.list(目录)){
stream.filter(p->p.getFileName().startsWith(前缀.getFileName()+))
.forEach(p->System.out.printf(“找到%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);
}
文件前缀=新文件(路径);
File directory=prefix.getParentFile();
列表匹配项=directory.listFiles((dir,name)->
name.startsWith(前缀.getName()+);
用于(文件匹配:匹配){
System.out.printf(“找到%s%n”,匹配);
}

您可以检查fileMIMEtype的MIMEType或
getExtension
@A\u N\u Y\R OP似乎已经在使用该类…我建议使用来尝试推断mime类型。但是没有一种100%可靠的方法可以知道一个文件是什么,除非试图把它当作某种东西来读,看看是否有问题。啊,是的。我只是说了我记得的。有这样一个例子吗?不幸的是,没有。我打算尝试一下,但基本上您需要
META-INF/services
中名为
java.nio.file.spi.FileTypeDetector的文件,其中列出了所有实现。然后将由JVM.Sad注册这些文件。但这是真的。这是唯一真正健壮的方法。@BoristheSpider另一方面,如果存在与libmagic等价的Java库,编写这样的检测器可能会更容易;就我个人而言,我还没有朝这个方向努力。为什么要在2015年使用java.io.File呢?也许我的知识已经过时了。现在,
java.io.File
是官方还是非正式地被弃用了?它并没有被弃用,事实上许多库和API仍然要求您在某种程度上使用它@fge只是在宣传我们停止向Java新手教授它,以便它可以开始被淘汰。
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);
}