2012-01-03 36 views
7

Tôi có một phương pháp mà có được văn bản từ một JTextArea, tạo một tập tin và viết văn bản trên nó như mã bên dưới:Thêm phần mở rộng .txt trong 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"); 
     } 
    } 
} 

và một bộ lọc tập tin 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)"; 
    } 
} 

Bộ lọc tệp cho txt hoạt động tốt nhưng những gì tôi muốn là thêm phần mở rộng ".txt" khi tôi nhập tên tệp.

Tôi phải sửa đổi mã của mình bằng cách nào?

Trả lời

5

CẬP NHẬT

Bạn đã chỉ cho tôi ra rằng kiểm tra các tệp hiện có không hoạt động. Tôi xin lỗi, tôi không nghĩ về nó khi tôi đề nghị bạn thay thế đường dây BufferedWriter. Bây giờ, thay thế này:

File sFile = fSave.getSelectedFile(); 

với:

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

Với sự thay thế này, người ta không phải bây giờ cần thiết để thay thế dòng của BufferedWriter, thêm .txt gia hạn. Sau đó, thay thế dòng đó bằng dòng trong mã bạn đã đăng (bằng BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); thay vì BufferedWriter out = new BufferedWriter(new FileWriter(sFile+".txt"));).

Bây giờ, chương trình sẽ hoạt động như mong đợi.

tôi quên đề cập rằng bạn có nhận xét dòng:

sFile.createNewFile(); 

Bằng cách này, bạn đang tạo ra một tập tin rỗng, với lớp File.

Ngay sau dòng này, có: BufferedWriter out = new BufferedWriter(new FileWriter(sFile));. Với dòng này, bạn đang tạo lại một tệp. Thủ tục viết đang diễn ra hai lần! Tôi nghĩ rằng nó vô dụng để chèn hai hướng dẫn đang làm nhiệm vụ tương tự.

Ngoài ra, trên các nhà xây dựng BufferedWriter, bạn có thể thêm một chuỗi cho tên tập tin (không thể vào File constructor), đó là lý do tại sao tôi đã thêm +".txt" (phần mở rộng) để sFile.

+0

Nó không hoạt động..không có phần mở rộng thêm –

+0

Rất lạ! Trên hệ thống của tôi tất cả mọi thứ hoạt động .. Tôi đã chỉnh sửa câu trả lời. –

+1

Cảm ơn bạn rất nhiều vì những thông tin hữu ích của bạn! Bạn nói đúng Tôi đã viết hai lần tập tin, không có lý do cho việc này. Bây giờ các tệp được lưu chính xác với hậu tố ".txt –

1

tôi đã thực hiện chức năng này cho mục đích này:

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

Sau đó, bạn có thể sử dụng chức năng ví dụ theo cách này:

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

nhờ nhưng tôi có ngoại lệ chạy: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException \t tại provegrafica.ProvaFramePop.createTxt (ProvaFramePop.java:145) –

+2

Điều này sẽ không thành công nếu tên tệp có chứa "."? – thomasa88

17

tôi chỉ sử dụng này

File fileToBeSaved = fileChooser.getSelectedFile(); 

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

Đây là một chức năng hữu ích từ một trong những chương trình của tôi mà bạn có thể sử dụng thay vì JFileChooser.getSelectedFile, để có được những phần mở rộng quá.

/** 
* 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; 
} 
Các vấn đề liên quan