2013-08-22 2 views
1

У меня есть кнопка, которая открывает диалоговое окно сохранения с установленными фильтрами расширения по умолчанию, но когда пользователь не предоставляет расширение имени файла в имени файла, он должен автоматически добавить расширение. Проблема в том, что когда это произойдет, файл не будет сохранять (или не сэкономить), но не вызывает никаких исключений. Всплывающее всплывающее окно сохранения файла показывает пользователю, что файл был успешно сохранен, но файл не найден в каталоге. Вот мой код:Файл не может быть сохранен при изменении имени файла

private void saveRecordsButtonActionPerformed(java.awt.event.ActionEvent evt)             
    {              
     if(evt.getSource() == this.saveRecordsButton) 
     { 
      String recordName = JOptionPane.showInputDialog(this, "Please type in the name of the record you are about to export: ", "Input Notice", JOptionPane.INFORMATION_MESSAGE); 
      if(recordName == null || recordName.equals("")) 
      { 
       JOptionPane.showMessageDialog(this, "You must type in the name of the record in order to save!", "Input Error!", JOptionPane.ERROR_MESSAGE); 
       return; 
      } 

      int returnVal = this.fileChooser.showSaveDialog(this); 
      if(returnVal == JFileChooser.APPROVE_OPTION) 
      { 
       //ObjectOutput oos = null; 
       try 
       { 
        File file = this.fileChooser.getSelectedFile(); 
        String recordDate = this.viewByDateCB.getSelectedItem().toString(); 
        XMLTableProducer xmlTableProducer = new XMLTableProducer(this.cbtm, "Cash Book Table", recordName, recordDate, new Date()); 

        if(!file.getName().contains(".")) 
        { 
         FileNameExtensionFilter filter = (FileNameExtensionFilter)this.fileChooser.getFileFilter(); 
         file = new File(file.getName()+(filter.getExtensions())[0]); 
         System.out.println(file.getName()); //This actually prints out the exact file name with extension the way I want 
        } 

        // if file doesnt exists, then create it 
        if(!file.exists()) 
        { 
         file.createNewFile(); 
        } 

        FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
        BufferedWriter bw = new BufferedWriter(fw); 
        PrintWriter out = new PrintWriter(bw); 
        out.print(xmlTableProducer.getDynamicText()); 
        out.close(); 
        bw.close(); 

        JOptionPane.showMessageDialog(this, "File Saved Successfully!", "Saved", JOptionPane.INFORMATION_MESSAGE); 
       } 
       catch(IOException xcp) 
       { 
        xcp.printStackTrace(System.err); 
       } 
      } 
     } 
    }   
+1

После того, как вы напечатаете данные (и перед тем, как закрыть своего автора), убедитесь, что вы вызываете 'out.flush();' –

+0

@JoshM Предполагая, что с процессом записи ничего не получается, не следует закрывать (лично, я параноик, поэтому я делаю оба;)) – MadProgrammer

ответ

2

Это file = new File(file.getName()+(filter.getExtensions())[0]); лишает путь к File ...

Предположим, что пользователь решил сохранить файл в C:\My Documents\Boss. Когда вы, как File#getName, он вернется только Boss. Что теперь означает, что файл будет сохранен в том же месте, что программа выполняется из (т.е. .\Bosss)

Вместо file = new File(file.getName()+(filter.getExtensions())[0]);, вы должны использовать file = new File(file.getPath()+(filter.getExtensions())[0]);, которые возвращают «полный» путь и имя файла, представленного File

Обновлено ...

Ваш процесс записи файла также немного прочь.

общее правило, если вы открываете поток, вы должны закрыть его ...

Вы не должны закрывать ресурсы в try-catch, если Exception происходит в try-catch, в close методы никогда не будет называться, в результате чего ресурсы открыты ...

try 
{ 
    /*...*/ 
    FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
    BufferedWriter bw = new BufferedWriter(fw); 
    PrintWriter out = new PrintWriter(bw); 
    out.print(xmlTableProducer.getDynamicText()); 
    out.close(); 
    bw.close(); 

    JOptionPane.showMessageDialog(this, "File Saved Successfully!", "Saved", JOptionPane.INFORMATION_MESSAGE); 
} 
catch(IOException xcp) 
{ 
    // If an exception occurs, the file will remain open 
    xcp.printStackTrace(System.err); 
} 

Вместо этого, вы должны использовать finally блок, чтобы попытаться закрыть все свои ресурсы, к примеру ...

BufferedWriter bw = null; 
try 
{ 
    /*...*/ 
    FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
    bw = new BufferedWriter(fw); 
    PrintWriter out = new PrintWriter(bw); 
    out.print(xmlTableProducer.getDynamicText()); 

    JOptionPane.showMessageDialog(this, "File Saved Successfully!", "Saved", JOptionPane.INFORMATION_MESSAGE); 
} 
catch(IOException xcp) 
{ 
    xcp.printStackTrace(System.err); 
} finally { 
    try 
    { 
     bw.close(); 
    } 
    catch (Exception exp) { 
    } 
} 
+0

Спасибо, MadProgrammer, я был очень образован вами. – Jevison7x

+0

Это делает один;) – MadProgrammer

2

Код выглядит нормально. Поскольку вы не видите исключения, я подозреваю, что вы не смотрите на правильный каталог. После

// if file doesn't exists, then create it 
         if(!file.exists()) 
         { 
          file.createNewFile(); 
         } 

добавить

System.out.println(file.getAbsolutePath()); 

Убедитесь, что каталог вы хотите, чтобы путь показан там ..

+0

Спасибо Зенилу, я думаю, вы немного открыли глаза. Он сохраняет файл в другой каталог целиком из выбранного каталога. Я пытаюсь понять, почему так происходит, или у вас есть идея? Выбранный каталог - «C: \ Users \ Jevison7x \ Documents \», в то время как целевой каталог «C: \ Users \ Jevison7x \ Documents \ NetBeansProjects \ RoyalineApp \» – Jevison7x

+0

JVM сохранит его в каталоге, в котором вы запускаете свою программу java из. Это называется рабочим каталогом. Вы можете видеть это, если вы печатаете System.getProperty («user.dir»); В вашем случае, поскольку вы запускаете директорию программы RoyalineApp, она сохраняет файл там. Это происходит только тогда, когда вы не укажете полный путь к файлу. – Zenil

+0

@ Jevison7x. Это то, что я (пытался) объяснить в своем ответе ... – MadProgrammer

Смежные вопросы