2012-01-03 14 views
7

mam metodę, która uzyskać tekst z JTextArea, utwórz plik i napisać na niej tekst jako kod poniżej:Dodaj rozszerzenie .txt w 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"); 
     } 
    } 
} 

i filtr plików 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)"; 
    } 
} 

Filtr plików dla txt działa poprawnie, ale chcę dodać rozszerzenie ".txt" podczas wpisywania nazwy pliku.

Jak zmienić kod?

Odpowiedz

5

UPDATE

pan zauważył mnie że sprawdzenie istniejących plików nie działa. Przykro mi, nie pomyślałem o tym, kiedy zasugerowałem ci zastąpienie linii BufferedWriter. Teraz zastąpić to:

File sFile = fSave.getSelectedFile(); 

z:

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

Z tej wymiany, nie jest już potrzebne, aby zastąpić linię BufferedWriter, dodając .txt dla rozszerzenia. Następnie zamień ten wiersz na wiersz w kodzie, który wysłałeś (z BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); zamiast BufferedWriter out = new BufferedWriter(new FileWriter(sFile+".txt"));).

Teraz program powinien działać zgodnie z oczekiwaniami.

Zapomniałem wspomnieć, że trzeba komentować linię:

sFile.createNewFile(); 

W ten sposób, tworzysz pusty plik, z klasą File.

Zaraz po tej linii znajduje się: BufferedWriter out = new BufferedWriter(new FileWriter(sFile));. W tym wierszu tworzony jest ponownie ten sam plik. Procedura pisania odbywa się dwa razy! Myślę, że bezużyteczne jest wstawianie dwóch instrukcji, które wykonują to samo zadanie.

Również na konstruktora BufferedWriter można dołączyć ciąg dla nazwy pliku (nie jest to możliwe na File konstruktora), to jest powód dlaczego dodałem +".txt" (rozszerzeniem) do sFile.

+0

To nie działa. Nie dodano rozszerzeń. –

+0

Bardzo dziwne! W moim systemie wszystko działa. Zmieniłem odpowiedź. –

+1

Dziękuję bardzo za przydatne informacje! Masz rację, napisałem dwa razy plik, nie ma ku temu powodu. Teraz pliki są poprawnie zapisane z przyrostkiem ".txt –

1

Robiłem tej funkcji w tym celu:

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

Następnie można użyć funkcji na przykład w ten sposób:

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

dzięki, ale mam Wyjątek run: Wyjątek w wątku "AWT-EventQueue-0" java.lang.NullPointerException \t w provegrafica.ProvaFramePop.createTxt (ProvaFramePop.java:145) –

+2

Czy nie zakończyłoby się to niepowodzeniem, jeśli nazwa pliku zawiera "."? – thomasa88

17

po prostu użyć tego

File fileToBeSaved = fileChooser.getSelectedFile(); 

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

Jest to funkcja użyteczności z jednego z moich programów, które można używać zamiast JFileChooser.getSelectedFile, aby uzyskać rozszerzenie zbyt.

/** 
* 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; 
} 
Powiązane problemy