使用JFileChooser设置默认保存扩展名

17

我正在尝试使用JFileChooser保存文件,但似乎遇到了一些问题。这是我的代码:

    if (e.getSource() == saveMenu) {

        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        FileNameExtensionFilter xmlFilter = new FileNameExtensionFilter("xml files (*.xml)", "xml");
        // add filters
        chooser.addChoosableFileFilter(xmlFilter);
        chooser.setFileFilter(xmlFilter);

        int result = chooser.showSaveDialog(Simulation.this);

        if (result == chooser.APPROVE_OPTION) {
            writeToXML(chooser.getSelectedFile());
        }

    }

这不会强制文件具有 .xml 扩展名,因此我尝试使用以下代码来强制该文件保存为扩展名为 .xml 的文件:

     OutputFormat format = OutputFormat.createPrettyPrint();
     format.setEncoding("UTF-8");
     XMLWriter xmlWriter = null;
     try {              
         xmlWriter = new XMLWriter(new OutputStreamWriter(
                 new FileOutputStream(f+".xml"), "UTF8"),
                 format);

然而,这样我就无法防止用户在JFileChooser中写入xpto.xml。如果他们这样做,文件将具有“两个扩展名”:它将成为一个名为xpto.xml.xml的文件。

所以我的问题是:

  • 如何使JFileChooser默认保存为xml文件?
  • 如果用户插入类似xpto.xml这样的文件名,我该如何将其保存为xpto.xml而不是xpto.xml.xml?
请注意,以上内容已被翻译为中文。

我只是想知道,如果用户输入类似于 something.xml.xml.xml 这样的名称,程序应该如何反应。 - Pshemo
只有将 + ".xml" 放入文件名中的问题是,如果您重新打开该文件,则文件名将变为 fileName.xml.xml。 - Dan Pickard
5个回答

21

正如你注意到的那样,JFileChooser 在保存时并不强制使用 FileFilter。它只会在显示的对话框中将现有的非 XML 文件变灰,仅此而已。要强制使用文件名,您需要做所有的工作。(这不仅仅是 JFileChooser 的问题 - 处理这个问题是很复杂的。你可能希望你的用户能够将其文件命名为 xml.xml.xml.xml 之类的名称。)

在您的情况下,我建议使用 Commons IO 中的 FilenameUtils

File file = chooser.getSelectedFile();
if (FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("xml")) {
    // filename is OK as-is
} else {
    file = new File(file.toString() + ".xml");  // append .xml if "foo.jpg.xml" is OK
    file = new File(file.getParentFile(), FilenameUtils.getBaseName(file.getName())+".xml"); // ALTERNATIVELY: remove the extension (if any) and replace it with ".xml"
}

如果您想在保存对话框中使用多个类型,这里还有一些想法:如何使用JFileChooser保存文件?


5
我认为问题在于 JFileChooser。大多数用户界面会自动添加文件扩展名,除非你在下拉菜单中选择了“所有文件”,否则它会保留它们的扩展名。这就是 JFileChooser 应该做的,也是我想要在我的应用程序中复制的行为(因为人们熟悉这种方式)。不过,如果没有深入研究 JFileChooser 的内部机制,这似乎是不可能实现的。 - Muzer
2
你需要为你想要的行为实现自己的文件选择器。虽然你所描述的不是任何标准,但当我写出一个文件扩展名,然后程序添加它自己的扩展名(然后操作系统隐藏它并且我有一个神秘地损坏的文件,因为某些开发人员认为他们在帮助)时,我感到非常恼火。 - Nathaniel Waisbrot

14

只是为了明确如何使用JFileChooser保存文件。

//set it to be a save dialog
 chooser.setDialogType(JFileChooser.SAVE_DIALOG);
//set a default filename (this is where you default extension first comes in)
 chooser.setSelectedFile(new File("myfile.xml"));
//Set an extension filter, so the user sees other XML files
 chooser.setFileFilter(new FileNameExtensionFilter("xml file","xml"));

现在在这个例子中,用户被鼓励将该项保存为XML文件,但他们可能并没有实际设置它。

if(chooser.showSaveDialog(this) == jFileChooser.APPROVE_OPTION) {
    String filename = chooser.getSelectedFile().toString();
    if (!filename .endsWith(".xml"))
        filename += ".xml";

    //DO something with filename
}

这是最简单的情况,如果您有多种可能的文件格式,那么您应该捕获所选的过滤器,验证那个扩展名,并根据所选的格式保存文件。但如果您正在这样做,那么您可能是一个高级Java程序员,而不是使用此帖子。


3
像这样怎么样:
    else if (e.getSource() == saveMenu) {
        int returnVal = chooser.showSaveDialog(Simulator.this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();

            String fname = file.getAbsolutePath();

            if(!fname.endsWith(".xml") ) {
                file = new File(fname + ".xml");

            if(!file.createNewFile()) {
                /*check with user??*/
            }

如果你想替换当前文件的扩展名,只需在file = new File(fname + ".xml");之前加入fname = fname.substring(0, fname.lastIndexOf('.'));即可。 - Neerkoli

1
你应该尝试这个:

if(!file.getName().contains(".")) file = new File(file.toString() + ".xml");

0
你应该试一下这个。我尝试过了,它有效。
FileOutputStream fileOut =  new FileOutputStream(file1+".xml");
hwb.write(fileOut);
fileOut.close();
System.out.println("\n Your file has been generated!");
JOptionPane.showMessageDialog(this,"File Created.");

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