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

使用JFileChooser将文件类型附加到Java中的文件,java,jfilechooser,file-type,Java,Jfilechooser,File Type,我正在尝试使用JFileChooser保存图像。我只希望用户能够将图像保存为jpg。但是,如果他们不键入.jpg,它将不会保存为图像。是否可以在文件末尾附加“.jpg” File file = chooser.getSelectedFile() + ".jpg"; 在向文件添加字符串时不起作用 为什么不将文件转换为字符串并在完成后创建一个新的文件 File f = chooser.getSelectedFile(); String filePath = f.getAbsolutePath(

我正在尝试使用JFileChooser保存图像。我只希望用户能够将图像保存为jpg。但是,如果他们不键入.jpg,它将不会保存为图像。是否可以在文件末尾附加“.jpg”

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

在向文件添加字符串时不起作用

为什么不将
文件
转换为
字符串
并在完成后创建一个新的
文件

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

请记住,如果
.jpg
已经存在,则不需要添加它。

最好的方法是检查可接受的条目。如果找不到,则替换文件exention,而不是在其上写入

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);
}

如果您分两步操作:将扩展名添加到所选文件,然后创建带有附加扩展名的
文件
对象,则此操作有效

String withExtension = chooser.getSelectedFile().getAbsolutePath() + ".jpg";
File file = new File( withExtension )
在您的问题中暗示,但仅涵盖所有基础:需要首先检查扩展是否已经存在,例如:

String withExtension = chooser.getSelectedFile().getAbsolutePath();
if( !withExtension.toLowerCase().endsWith( ".jpg" ) )
   withExtension += ".jpg";
[您可能需要将“.jpeg”添加到上面的
中,如果
中-它是jpeg文件的有效扩展名]

下面的代码可能有效,也可能无效
File
有一个
toString()
可以编译,但是我更愿意使用上面的方法,在这里我可以控制得到的确切路径名。
文件
对象的
toString()
文档对我来说有点不清楚它到底返回了什么。在这种情况下,我更喜欢调用一个函数,我知道它肯定会返回我所需要的

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

这个答案就行了。但是,请执行filePath.concat(“.jpg”)以避免不必要的StringBuilder构造。@Justin创建新的
StringBuilder
的开销应该可以忽略,因为他只执行了一次操作。谢谢Jeffrey:)很遗憾,我还不能投票。你知道为什么这里需要格式名吗:ImageIO.write(图像,“jpg”,文件);这似乎没有什么不同?如果你需要文件的格式,在你的代码中,你可能想调整他的答案,使之与我的一致。检查jpg的多个扩展。他的答案会有用的。但是,它只是在文件的末尾附加.jpg,因此,例如,如果您有:c:\examplepath\examplefile.txt,它将把它转换为:c:\examplepath\examplefile.txt.jpg…和
toLowerCase()
用户在测试是否存在扩展名之前选择的文件名。否则,代码将在Windows中中断,用户可能(出于任何原因)键入“myfile.JPG”。这是一个很好的解决方案,可以用一个
if
覆盖所有扩展名,但需要添加
(?i)
,使其不区分大小写(捕获JPG和JPG):
if(!path.matches((?i)。*\(JPG);JPG>)
。还需要考虑所选(或键入的)文件名没有扩展名的情况,其中
path.lastIndexOf(“.”
返回-1(例如,通过输入
test
,代码会将其更改为
jpg
,而不是
test.jpg
。同意如果您想要速度,可以一起跳过正则表达式。代码即将读取或写入磁盘,与之相比,正则表达式将变得苍白。我喜欢您使用正则表达式捕获所有可能扩展的方式.