2012-01-03 15 views
7

Ho un metodo che ottiene testo da un JTextArea, creare un file e scrivere il testo su di esso come codice qui sotto:Aggiungi estensione .txt in JFileChooser

public void createTxt() { 

    TxtFilter txt = new TxtFilter(); 

    JFileChooser fSave = new JFileChooser(); 

    fSave.setFileFilter(txt); 
    int result = fSave.showSaveDialog(this); 
    if(result == JFileChooser.APPROVE_OPTION) { 
     File sFile = fSave.getSelectedFile(); 
     FileFilter selectedFilter = fSave.getFileFilter(); 

     String file_name = sFile.getName(); 
     String file_path = sFile.getParent(); 

     try{ 
      if(!sFile.exists()) { 
       sFile.createNewFile(); 
       BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); 
       out.write(jTextArea1.getText()); 
       out.close(); 
       JOptionPane.showMessageDialog(null, "Warning file • " + file_name + " • created succesfully in \n" + file_path);  
      } else { 
       String message = "File • " + file_name + " • already exist in \n" + file_path + ":\n" + "Do you want to overwrite?"; 
       String title = "Warning"; 
       int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION); 
       if(reply == JOptionPane.YES_OPTION){ 
        sFile.delete(); 
        sFile.createNewFile(); 
        BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); 
        out.write(jTextArea1.getText()); 
        out.close(); 
        JOptionPane.showMessageDialog(null, "File • " + file_name + " • overwritten succesfully in \n" + file_path); 

       } 
      } 
     } 
     catch(IOException e) { 
      System.out.println("Error"); 
     } 
    } 
} 

e un filtro di file txt

public class TxtFilter extends FileFilter{ 
    @Override 
    public boolean accept(File f){ 
     return f.getName().toLowerCase().endsWith(".txt")||f.isDirectory(); 
    } 
    @Override 
    public String getDescription(){ 
     return "Text files (*.txt)"; 
    } 
} 

Il filtro file per txt funziona bene ma quello che voglio è aggiungere l'estensione ".txt" quando scrivo il nome del file.

Come devo modificare il mio codice?

risposta

5

UPDATE

Mi hai puntato fuori che il controllo per i file esistenti non funziona. Mi dispiace, non ci ho pensato quando ti ho suggerito di sostituire la linea BufferedWriter. Ora, sostituire questo:

File sFile = fSave.getSelectedFile(); 

con:

File sFile = new File(fSave.getSelectedFile()+".txt"); 

Con questa sostituzione, non è ora necessario per sostituire la linea di BufferedWriter, aggiungendo .txt per l'estensione. Quindi, sostituisci la riga con la riga nel codice che hai postato (con BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); anziché BufferedWriter out = new BufferedWriter(new FileWriter(sFile+".txt"));).

Ora il programma dovrebbe funzionare come previsto.

Ho dimenticato di dire che è necessario commentare la riga:

sFile.createNewFile(); 

In questo modo, si sta creando un file vuoto, con la classe File.

Subito dopo questa riga, c'è: BufferedWriter out = new BufferedWriter(new FileWriter(sFile));. Con questa linea, si sta creando di nuovo lo stesso file. La procedura di scrittura sta accadendo due volte! Penso sia inutile inserire due istruzioni che stanno facendo lo stesso compito.

Inoltre, sul costruttore BufferedWriter, è possibile aggiungere una stringa per il nome del file (non è possibile in File costruttore), questo è il motivo per cui ho aggiunto +".txt" (l'estensione) per sFile.

+0

Non funziona ... nessuna aggiunta di estensioni –

+0

Molto strano! Sul mio sistema tutto funziona .. Ho modificato la risposta. –

+1

Grazie mille per le tue informazioni utili! Hai ragione, ho scritto due volte il file, non c'è motivo per questo. Ora i file sono salvati correttamente con suffisso ".txt –

1

ho fatto questa funzione per questo scopo:

/** 
* Add extension to a file that doesn't have yet an extension 
* this method is useful to automatically add an extension in the savefileDialog control 
* @param file file to check 
* @param ext extension to add 
* @return file with extension (e.g. 'test.doc') 
*/ 
private String addFileExtIfNecessary(String file,String ext) { 
    if(file.lastIndexOf('.') == -1) 
     file += ext; 

    return file; 
} 

quindi è possibile utilizzare la funzione per esempio in questo modo:

JFileChooser fS = new JFileChooser(); 
String fileExt = ".txt"; 
addFileExtIfNecessary(fS.getSelectedFile().getName(),fileExt) 
+0

grazie ma ho Eccezione run: Exception in thread java.lang "AWT-EventQueue-0".NullPointerException \t in provegrafica.ProvaFramePop.createTxt (ProvaFramePop.java:145) –

+2

Non avrebbe questo esito se il nome del file contiene "."? – thomasa88

17

mi basta usare questo

File fileToBeSaved = fileChooser.getSelectedFile(); 

if(!fileChooser.getSelectedFile().getAbsolutePath().endsWith(suffix)){ 
    fileToBeSaved = new File(fileChooser.getSelectedFile() + suffix); 
} 
3

Si tratta di una funzione di utilità da uno dei miei programmi che è possibile utilizzare al posto di JFileChooser.getSelectedFile, per ottenere l'estensione troppo.

/** 
* Returns the selected file from a JFileChooser, including the extension from 
* the file filter. 
*/ 
public static File getSelectedFileWithExtension(JFileChooser c) { 
    File file = c.getSelectedFile(); 
    if (c.getFileFilter() instanceof FileNameExtensionFilter) { 
     String[] exts = ((FileNameExtensionFilter)c.getFileFilter()).getExtensions(); 
     String nameLower = file.getName().toLowerCase(); 
     for (String ext : exts) { // check if it already has a valid extension 
      if (nameLower.endsWith('.' + ext.toLowerCase())) { 
       return file; // if yes, return as-is 
      } 
     } 
     // if not, append the first extension from the selected filter 
     file = new File(file.toString() + '.' + exts[0]); 
    } 
    return file; 
} 
Problemi correlati