webentwicklung-frage-antwort-db.com.de

Legen Sie die standardmäßige Speichererweiterung mit JFileChooser fest

Ich versuche, eine Datei mit JFileChooser zu speichern. Ich habe jedoch Probleme damit. Hier ist mein 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());
        }

    }

Dies erzwingt nicht, dass die Datei die Erweiterung .xml hat. Daher habe ich versucht, den folgenden Code zu verwenden, um das Speichern der Datei mit der Erweiterung .xml zu erzwingen

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

Damit kann ich jedoch nicht verhindern, dass der Benutzer xpto.xml in die JFileChooser schreibt, und wenn dies der Fall ist, hat die Datei "zwei Erweiterungen": Es wird eine Datei mit dem Namen xpto.xml.xml sein.

Meine Fragen sind also:

  • Wie kann ich die Variable JFileChooser dazu bringen, eine XML-Datei standardmäßig zu speichern?
  • Wenn der Benutzer einen Dateinamen wie xpto.xml einfügt, wie kann ich ihn dann als xpto.xml und nicht als xpto.xml.xml speichern?
13
SaintLike

Wie Sie bemerkt haben, erzwingt JFileChooser die FileFilter beim Speichern nicht. Die vorhandene Nicht-XML-Datei wird im angezeigten Dialogfeld grau dargestellt, aber das ist es. Um den Dateinamen durchzusetzen, müssen Sie die gesamte Arbeit erledigen. (Dies ist nicht nur eine Frage des Anstoßes von JFileChooser - es ist ein komplexes Problem, mit dem Sie sich auseinandersetzen müssen. Sie könnten want Ihre Benutzer können ihre Dateien xml.xml.xml.xml benennen.)

In Ihrem Fall empfehle ich die Verwendung von FilenameUtils von 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"
}

Es gibt auch einige Vorschläge, was Sie tun können, wenn Sie mehrere Datentypen im Dialogfeld speichern möchten: Wie kann ich eine Datei mit JFileChooser speichern?

19

Nur um klar zu machen, wie man mit JFileChooser Dateien speichert.

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

nun wurde der Benutzer ermutigt, das Element in diesem Beispiel als XML-Datei zu speichern, hat es aber möglicherweise nicht gesetzt.

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

   //DO something with filename

 }

Dies ist der einfachste Fall. Wenn Sie über mehrere mögliche Dateiformate verfügen, sollten Sie den ausgewählten Filter abfangen, die Erweiterung THAT überprüfen und die Datei entsprechend dem ausgewählten Format speichern. Wenn Sie das tun, sind Sie wahrscheinlich ein fortgeschrittener Java-Programmierer und nutzen diesen Beitrag nicht.

10
DiamondDrake

Wie wäre es mit so etwas:

    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
7stud

Sie sollten es versuchen. Ich habe das gemacht und es hat funktioniert.

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

Sie sollten dies versuchen:

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