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

我正在尝试使用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?

正如您所注意到的, 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保存文件?

只是为了明确如何使用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 } 

这是最简单的情况,如果您有多种可能的文件格式,那么您应该捕获所选的filter,validationTHAT扩展,并根据所选格式保存文件。 但如果你这样做,你可能是一个高级的java程序员,而不是利用这篇文章。

这样的事情怎么样:

  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??*/ } 

你应该试试这个。 我做到了这一点并且有效。

 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."); 

你应该试试这个:

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