如何在不知道文件扩展名的情况下实例化java.io.File对象?

如何在不知道文件扩展名的情况下实例化java.io.File对象?,java,java-io,Java,Java Io,我在数据库中存储图像的文件名(user_id.extension,例如14.png) 假设,我需要检索一个文件并将其写入流。但是我如何在不知道文件扩展名的情况下创建java.io.File对象(图像可以是jpg、png等等)?现在在我的数据库中只有扩展名为.png的图像,我这样做: File file = new File(pathToAvatarFolder + File.separator + user.getId() + ".png"); 有没有优雅的解决方案?我想到的唯一暴力解决方案是

我在数据库中存储图像的文件名(user_id.extension,例如14.png)

假设,我需要检索一个文件并将其写入流。但是我如何在不知道文件扩展名的情况下创建
java.io.File
对象(图像可以是jpg、png等等)?现在在我的数据库中只有扩展名为.png的图像,我这样做:

File file = new File(pathToAvatarFolder + File.separator + user.getId() + ".png");
有没有优雅的解决方案?我想到的唯一暴力解决方案是:

List<String> imageExtensions = new ArrayList<>();
imageExtensions.add(".png");
imageExtensions.add(".jpg");
imageExtensions.add(".jpeg");

File file;
for(int i = 0; i < imageExtensions.size(); i++) {
    file = new File(pathToAvatarFolder + File.separator + user.getId() + imageExtensions.get(i));
    if (file.exists()) {
        break;
    }

    file = null;
}
List imageExtensions=new ArrayList();
添加(“.png”);
添加(“.jpg”);
添加(“.jpeg”);
文件;
对于(int i=0;i

为了清楚起见,我需要使用不带扩展名的路径名来实例化
java.io.File
对象

import java.nio.*;
import java.nio.file.*;

Files.probeContentType((new File("filename.ext")).toPath());

这将返回文件的类型。对于png,它将是image/png

从长远来看,还要存储文件扩展名/mime类型。您的解决方案可能比使用文件过滤器进行目录扫描要快。正如Joop提到的,也可以将文件扩展名保存到数据库中。或者,将化身fileext更改为固定值。无论如何,我建议您在上传时生成一个随机文件名。这可以防止很多攻击场景。这行不通。OP缺少文件的具体路径,因此无法检查其内容。“为了清楚起见,我需要使用不带扩展名的路径名来实例化java.io.file对象。”@salkisore OP声称拥有该路径。我使用它来确定给定文件是否为图像
if(Files.probeContentType((新文件(“filename.ext”)).toPath()).startsWith(“image”){…}
使用此条件,我们可以稍后实例化该文件。