【问题标题】:Appending the file type to a file in Java using JFileChooser使用 JFileChooser 将文件类型附加到 Java 中的文件
【发布时间】:2012-05-06 23:07:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jfilechooser file-type


    【解决方案1】:

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

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

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

    【讨论】:

    • 这个答案就可以了。但是,请执行 filePath.concat(".jpg") 以避免不必要的 StringBuilder 构造。
    • @Justin 创建一个新的StringBuilder 的开销应该可以忽略不计,因为他只执行了一次操作。
    • 谢谢 Jeffrey :) 遗憾的是我还不能投票。你知道为什么这里需要格式名吗:ImageIO.write(image, "jpg", file);它似乎没有什么区别?如果您必须在文件上保留格式?
    • 在您的代码中,您可能想调整他对我的回答。检查 jpg 的多个扩展。他的回答会奏效。但是,它只是将 .jpg 附加到文件的末尾,因此例如,如果您有: c:\examplepath\examplefile.txt 它会将其转换为: c:\examplepath\examplefile.txt.jpg
    • ...和toLowerCase() 用户在测试扩展是否存在之前选择的文件名。否则,代码将在 Windows 中中断,用户可能(无论出于何种原因)键入“myfile.JPG”。
    【解决方案2】:

    如果您分两步执行此操作,则可以:将扩展名添加到所选文件,然后创建 File 对象并附加扩展名。

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

    在您的问题中暗示,但只是为了涵盖所有基础:需要首先检查扩展名是否已经存在,例如:

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

    [您可能希望将“.jpeg”添加到上面的if - 它是 JPEG 文件的有效扩展名]

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

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

    【讨论】:

      【解决方案3】:

      最好的方法是检查一个可接受的条目。如果找不到,请替换文件扩展名而不是在上面写。

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

      【讨论】:

      • 一个很好的解决方案,用一个if 覆盖所有扩展,但需要添加(?i) 以使其不区分大小写(捕获 JPG 和 jpg):if (!path.matches("(?i).*\\.(jpg|jpeg)"))。还需要考虑所选(或键入)文件名没有扩展名的情况,其中path.lastIndexOf(".")returns -1(例如输入test,代码会将其更改为jpg,而不是test.jpg.
      • 同意如果你想要速度,你可以做的另一件事是一起跳过正则表达式。
      • 代码即将读取或写入磁盘,与此相比,正则表达式会显得苍白。我喜欢您使用正则表达式捕获所有可能的扩展名的方式。
      猜你喜欢
      • 2011-01-14
      • 2013-10-18
      • 1970-01-01
      • 2017-08-30
      • 2023-03-07
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多