我正在尝试使用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);
然而,有了这个,我无法阻止用户在xpto.xml
中编写JFileChooser
,如果他们这样做,该文件将具有“两个扩展名”:它将是一个名为{的文件{1}}
所以我的问题是:
xpto.xml.xml
保存xml文件?答案 0 :(得分:19)
正如您所注意到的,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"
}
如果您想在此处的保存对话框中使用多种类型,还有一些想法可以解决:How to save file using JFileChooser?
答案 1 :(得分:10)
只是为了明确如何使用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
}
这是最简单的情况,如果您有多种可能的文件格式,那么您应该捕获所选过滤器,验证THAT扩展名,并根据所选格式保存文件。但如果你这样做,你可能是一个高级的java程序员,而不是利用这篇文章。
答案 2 :(得分: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??*/
}
答案 3 :(得分: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.");
答案 4 :(得分:0)
你应该试试这个:
if(!file.getName().contains(".")) file = new File(file.toString() + ".xml");