Установите расширение сохранения по умолчанию с помощью 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);

Однако с этим я не могу запретить пользователю писать xpto.xml в JFileChooser, и если они это сделают, файл будет иметь "два расширения": это будет файл с именем xpto.xml.xml

Итак, мои вопросы:

  • Как я могу сделать JFileChooser сохранить xml файл по умолчанию?
  • Если пользователь вставляет имя файла, например xpto.xml, как его сохранить как xpto.xml, а не xpto.xml.xml?

Ответ 1

Как вы заметили, JFileChooser не применяет FileFilter к сохранению. В диалоговом окне, который он отображает, будет отсутствовать существующий файл без XML. Чтобы обеспечить соблюдение имени файла, вам необходимо выполнить всю работу. (Это не просто вопрос сосания JFileChooser - это сложная проблема для решения проблемы. Возможно, вы захотите, чтобы ваши пользователи могли называть свои файлы xml.xml.xml.xml.)

В вашем случае я рекомендую использовать FilenameUtils из 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"
}

Также есть идеи, что делать, если вы хотите, чтобы в диалоговом окне сохранения было несколько типов: Как сохранить файл с помощью JFileChooser?

Ответ 2

Просто чтобы понять, как использовать 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-программист и не используете этот пост.

Ответ 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??*/
            }

Ответ 4

Вы должны попробовать это. Я сделал это, и это сработало.

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

Ответ 5

Вы должны попробовать следующее:

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