在JFileChooser中添加.txt扩展名

8

我有一个方法可以从JTextArea获取文本,创建一个文件并将文本写入其中,代码如下:

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");
       }
    }
}

和文本文件过滤器

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)";
    }
}

文件筛选器对txt文件的过滤效果很好,但是我想实现的是在输入文件名时添加".txt"扩展名。

我需要如何修改我的代码?

4个回答

18

我只是使用这个

File fileToBeSaved = fileChooser.getSelectedFile();

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

7

更新

你指出检查现有文件的代码不起作用。很抱歉,在建议您替换BufferedWriter代码行时,我没有考虑到这一点。

现在,请使用以下代码替换:

File sFile = fSave.getSelectedFile();

使用:

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

用这个替换,现在不需要替换BufferedWriter的行,并添加.txt 作为扩展名。然后,使用您发布的代码中的行替换该行(使用BufferedWriter out = new BufferedWriter(new FileWriter(sFile)); 而不是BufferedWriter out = new BufferedWriter(new FileWriter(sFile+".txt"));)。
现在程序应该如预期般工作。
我忘了提到您必须注释掉该行:
sFile.createNewFile();

以这种方式,你正在创建一个空文件,具有类File
紧接着这行代码,有:BufferedWriter out = new BufferedWriter(new FileWriter(sFile));。通过这行代码,你又再次创建了同一个文件。写入过程发生了两次!我认为插入两个执行相同任务的指令是无用的。
此外,在BufferedWriter构造函数中,你可以附加一个字符串作为文件名(File构造函数不支持),这就是我在sFile后面添加+".txt"(扩展名)的原因。

非常奇怪!在我的系统上一切正常..我编辑了答案。 - Alberto Solano
1
非常感谢您提供的有用信息! 您是正确的,我确实写了两次文件,这没有任何理由。 现在文件已经正确保存,并带有后缀“.txt”。 - Alberto acepsut
1
只有一个小问题还没有解决:我现在可以自动保存为 .txt 扩展名,但 FileChooser 描述名称中没有 .txt。这意味着当我再次使用先前的文件名保存时,它永远不会提示我文件已存在,并始终覆盖先前的文件。 例如:假设我想将文件保存为名称 = test:现在它将保存为 test.txt 并创建这样的文件。如果我想要使用相同的名称保存另一个文件,它不会认为 test 文件已经存在,因为已经保存了 test.txt 文件。 - Alberto acepsut
@Albertoacepsut 我明白了。但是你用 "BufferedWriter out = new BufferedWriter(new FileWriter(sFile+".txt"));" 替换了我建议给你的字符串,并且在 'else' 循环中注释掉了 "sFile.createNewFile();" 这一行? - Alberto Solano
是的,我试过了,但问题是这样做永远找不到已存在的文件,所以它从不询问是否覆盖。 - Alberto acepsut
没问题,对不起,因为我没有先考虑检查文件是否存在。 - Alberto Solano

4

这是我一个程序中的实用函数,你可以使用它来代替JFileChooser.getSelectedFile,以获取文件的扩展名。

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

1
我已经为此目的编写了这个函数:
/**
 * 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;
}

然后你可以这样使用函数:

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

谢谢,但是我遇到了异常: 运行: 在AWT-EventQueue-0线程中的异常:java.lang.NullPointerException 位于provegrafica.ProvaFramePop.createTxt(ProvaFramePop.java:145) - Alberto acepsut
2
如果文件名包含“。”,那么这种方法会失败吗? - thomasa88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接