2012-01-03 20 views
7

Tengo un método que llegar el texto de un JTextArea, crear un archivo y escribir texto en él como código de abajo:extensión .txt en 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"); 
     } 
    } 
} 

y un filtro de archivo 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)"; 
    } 
} 

El filtro de archivos para txt funciona bien, pero lo que quiero es agregar la extensión ".txt" cuando escribo el nombre del archivo.

¿Cómo tengo que modificar mi código?

Respuesta

5

ACTUALIZACIÓN

Me señaló que el control de los archivos existentes no funciona. Lo siento, no pensé en eso cuando te sugerí que reemplazaras la línea BufferedWriter. Ahora, en lugar de esto:

File sFile = fSave.getSelectedFile(); 

con:

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

Con esta sustitución, no se necesita ahora para reemplazar la línea de BufferedWriter, añadiendo .txt para la extensión. Luego, reemplace esa línea con la línea en el código que publicó (con BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); en lugar de BufferedWriter out = new BufferedWriter(new FileWriter(sFile+".txt"));).

Ahora el programa debería funcionar como se esperaba.

me olvidó mencionar que hay que comentar la línea:

sFile.createNewFile(); 

De esta manera, va a crear un archivo vacío, con la clase File.

Justo después de esta línea, está: BufferedWriter out = new BufferedWriter(new FileWriter(sFile));. Con esta línea, está creando nuevamente el mismo archivo. ¡El procedimiento de escritura está sucediendo dos veces! Creo que es inútil insertar dos instrucciones que están haciendo la misma tarea.

Además, en el BufferedWriter constructor, puede anexar una cadena para el nombre del archivo (no es posible en File constructor), esa es la razón por la que he añadido +".txt" (la extensión) a sFile.

+0

No funciona ... no se han agregado extensiones –

+0

¡Muy extraño! En mi sistema todo funciona ... Edité la respuesta. –

+1

¡Muchas gracias por sus útiles informaciones! Tiene razón, escribí dos veces el archivo, no hay ninguna razón para esto. Ahora los archivos están guardados correctamente con el sufijo ".txt –

1

que he hecho esta función para este propósito:

/** 
* 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; 
} 

continuación, puede utilizar la función, por ejemplo, de esta manera:

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

gracias pero tienen Excepción de ejecución: Excepción en hilo java.lang "AWT-EventQueue-0".NullPointerException \t en provegrafica.ProvaFramePop.createTxt (ProvaFramePop.java:145) –

+2

¿No fallaría si el nombre de archivo contiene "."? – thomasa88

17

sólo tiene que utilizar este

File fileToBeSaved = fileChooser.getSelectedFile(); 

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

Ésta es una función de utilidad de uno de mis programas que se pueden utilizar en lugar de JFileChooser.getSelectedFile, para conseguir la extensión también.

/** 
* 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; 
}