J'essaie de sauvegarder un fichier en utilisant JFileChooser
. Cependant, il me semble avoir des problèmes avec cela. Voici mon code:
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());
}
}
Cela ne force pas le fichier à porter une extension .xml
. J'ai donc essayé d'utiliser le code suivant pour forcer le fichier à être enregistré avec l'extension .xml
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter = null;
try {
xmlWriter = new XMLWriter(new OutputStreamWriter(
new FileOutputStream(f+".xml"), "UTF8"),
format);
Cependant, avec cela, je ne peux pas empêcher l’utilisateur d’écrire xpto.xml
dans la JFileChooser
et s’ils le font, le fichier aura "deux extensions": ce sera un fichier nommé xpto.xml.xml
Donc mes questions sont:
JFileChooser
enregistre un fichier xml par défaut?Comme vous l'avez remarqué, JFileChooser
n'impose pas la FileFilter
à une sauvegarde. Le fichier non-XML existant est grisé dans la boîte de dialogue qu'il affiche, mais c'est tout. Pour appliquer le nom de fichier, vous devez effectuer tout le travail. (Ce n’est pas seulement une question de succion de JFileChooser - c’est un problème complexe à traiter. Vous pourriez peut-être {vouloir} _ nommer leurs fichiers xml.xml.xml.xml
.)
Dans votre cas, je vous recommande d'utiliser FilenameUtils
from Commons IO:
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"
}
Il y a aussi quelques idées sur ce qu'il faut faire si vous voulez plusieurs types dans la boîte de dialogue de sauvegarde ici: Comment sauvegarder un fichier en utilisant JFileChooser?
Juste pour expliquer comment utiliser JFileChooser pour sauvegarder des fichiers.
//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"));
maintenant, l'utilisateur était invité à enregistrer l'élément en tant que fichier XML dans cet exemple, mais il se peut qu'il ne l'ait pas réellement défini.
if(chooser.showSaveDialog(this) == jFileChooser.APPROVE_OPTION)
{
String filename = chooser.getSelectedFile().toString();
if (!filename .endsWith(".xml"))
filename += ".xml";
//DO something with filename
}
C'est le cas le plus simple. Si vous avez plusieurs formats de fichiers possibles, vous devez alors capturer le filtre sélectionné, vérifier cette extension et également enregistrer le fichier en fonction du format sélectionné. mais si vous faites cela, vous êtes probablement un programmeur Java expérimenté et n'utilisez pas ce post.
Que diriez-vous quelque chose comme ça:
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??*/
}
Tu devrais essayer ça. Je l'ai fait et ça a marché.
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.");
Vous devriez essayer ceci:
if(!file.getName().contains(".")) file = new File(file.toString() + ".xml");