使用JFileChooser在Java中将文件类型附加到文件

9

我想使用JFileChooser保存一张图片。我只希望用户将该图片保存为jpg格式。但是,如果他们没有输入 ".jpg" 后缀,则无法以图像的形式保存。是否可能在文件末尾添加 ".jpg" 后缀?

File file = chooser.getSelectedFile() + ".jpg";  

我在向文件添加字符串时出现了问题。

3个回答

13

为什么不将 File 转换为 String,并在完成后创建一个新的 File

File f = chooser.getSelectedFile();
String filePath = f.getAbsolutePath();
if(!filePath.endsWith(".jpg")) {
    f = new File(filePath + ".jpg");
}

记住,如果已经存在,您不需要添加 .jpg


这个答案可以完成它。但是为了避免不必要的 StringBuilder 构建,请执行 filePath.concat(".jpg")。 - Justin
@Justin 只执行一次操作,创建新的 StringBuilder 的开销应该可以忽略不计。 - Jeffrey
谢谢Jeffrey :) 不幸的是我还不能点赞。你知道为什么这里需要格式名称吗:ImageIO.write(image,“jpg”,file); 它似乎没有任何区别?如果文件上必须有格式,那么为什么还需要指定它? - Kingteeb
在您的代码中,您可能想要将他的回答调整为我的回答,以检查多个 jpg 扩展名。他的回答是有效的。但是它只是在文件末尾附加 .jpg,例如,如果您有:c:\examplepath\examplefile.txt它会变成:c:\examplepath\examplefile.txt.jpg - Justin
2
在测试文件扩展名之前,将用户选择的文件名使用toLowerCase()转换为小写字母。否则,在Windows系统下,用户可能会输入“myfile.JPG”,导致代码出现错误。 - Christian Garbin
哈哈,说得对!该死的,有很多事情要考虑!:P - Kingteeb

4

如果您按照以下两个步骤操作,它就可以正常工作:给所选文件添加扩展名,然后创建一个附加有该扩展名的File对象。

String withExtension = chooser.getSelectedFile().getAbsolutePath() + ".jpg";
File file = new File( withExtension )

根据您的问题,但为了覆盖所有情况:首先需要检查扩展名是否已存在,例如:

String withExtension = chooser.getSelectedFile().getAbsolutePath();
if( !withExtension.toLowerCase().endsWith( ".jpg" ) )
   withExtension += ".jpg";

[你可能需要在上面的 if 语句中添加 ".jpeg" - 它是 JPEG 文件的有效扩展名]

下面的代码可能会工作,也可能不会。 File 有一个 toString() 方法使其可以编译,但我更愿意使用上面的方法,因为我可以控制我获取的确切路径名。对于 File 对象的 toString() 文档对我来说有点不清楚它到底返回什么。在像这样的情况下,我更喜欢调用一个我知道肯定返回我需要的东西的函数。

File file = new File( chooser.getSelectedFile() + ".jpg" ); 

1
最好的方法是检查是否有可接受的输入。如果没有找到,则替换文件扩展名而不是在其上面写入。
File f = chooser.getSelectedFile().getAbsolutePath();
String path = f.getAbsolutePath();
if (!path.matches(".*\\.(jpg|jpeg)")) {
    // If the extension isn't there. We need to replace it
    path = path.substring(0, path.lastIndexOf(".") + 1).concat("jpg");
    f = new File(path);
}

1
一个很好的解决方案是使用一个if语句来覆盖所有扩展名,但需要添加(?i)以使其不区分大小写(捕获JPG和jpg):if (!path.matches("(?i).*\\.(jpg|jpeg)"))。还需要考虑所选(或键入)文件名没有扩展名的情况,其中path.lastIndexOf(".")返回-1(例如,对于输入test,代码将把它更改为jpg,而不是test.jpg)。 - Christian Garbin
同意,另一件你可以做的事情是如果你想要速度的话完全可以跳过正则表达式。 - Justin
代码即将读取或写入磁盘,正则表达式在这方面相形见绌。我喜欢你使用正则表达式捕获所有可能的扩展名的方式。 - Christian Garbin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接