Java file.exists()错误

时间:2014-11-30 23:43:23

标签: java io save jfilechooser

我目前正在制作"记事本 - 类型"我的面向对象的Java类的文件。我完成了大部分程序 - 不过我仍然坚持以下问题:

当程序试图保存文件时,应首先检查文件是否存在,显然如果文件存在,程序将提示用户允许覆盖文件的现有副本[覆盖提示不是写了但是它会进入if(selectedFile.exists()== true)部分代码] - 如果文件不存在,程序将创建它。

我遇到的问题是程序总是在检查文件存在之前创建文件 。我已经查看了类似问题的大概20-30个答案 - 主要是关于stackoverflow,并且还没有得到我需要的答案。我不确定我是否只是"没有得到它"或者我是否真的做错了什么..

对此问题的任何回答 - 或暗示在哪里找到答案 - 将不胜感激。

谢谢。

完整代码(程序的保存部分如下所示)。

 else if(source == saveFile)//-------------------------//SAVE FILE//--------------------------   
     {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
        fileChooser.setDialogTitle("JavaPad - Save File");
        int result = fileChooser.showSaveDialog(fileChooser);
        String myFile;

        try
        {
           if(result == JFileChooser.APPROVE_OPTION)
           {
              myFile = fileChooser.getSelectedFile().getName();
              File selectedFile = new File(myFile);

              String[] lines = textArea.getText().split(System.getProperty("line.separator"));
              readToSave = new Scanner(lines.toString()); // CANNOT use toString() on an Array -                                        THIS WILL BE CHANGED PROPERLY?
              PrintWriter savePWriter = new PrintWriter(selectedFile);

              if(selectedFile.exists() == true)
              {
                 JOptionPane.showMessageDialog(null, "This file already exists.");
                 statusLabel.setText("File Save Aborted...");
              }
              else
              {
                 System.out.println("Creating File: " + myFile);
                 File newFile = new File(fileChooser.getSelectedFile().getName());
                 savePWriter = new PrintWriter(newFile);

                 int i = 0;
                 while(i < lines.length)
                 {
                    savePWriter.append(lines[i] + "\n");
                    System.out.println("Lines appended = " + i);
                    i++;                  
                 }
                 savePWriter.flush();
                 savePWriter.close();
                 statusLabel.setText("File Saved.");
              } 
           }
           else
           {
                JOptionPane.showMessageDialog(null, "Save has been canceled.");
           }
        }
        catch(IOException IOSaveError)
        {
           System.out.println(IOSaveError);
        }
     }

3 个答案:

答案 0 :(得分:1)

在您检查new PrintWriter(selectedFile)是否存在之前,您正在调用selectedFile来创建文件。

答案 1 :(得分:0)

在检查文件是否存在之前,请勿创建PrintWriterPrintWriter是导致文件写入的原因。

答案 2 :(得分:0)

你这样做:

 myFile = fileChooser.getSelectedFile().getName();
 File selectedFile = new File(myFile);
 PrintWriter savePWriter = new PrintWriter(selectedFile); // Creates File! Probably unwanted.
 if(selectedFile.exists() == true) // always true because of the line above

顺便说一下,你的代码太复杂了。您可以简单地使用对话框返回的File对象,而不是让变量selectedFilenewFile都是新创建的File对象:newFile = fileChooser.getSelectedFile()

if(selectedFile.exists() == true)

可以简化为

if (selectedFile.exists())

我建议尽可能使用try-with-resources进行I / O:

try (final PrintWriter writer = new PrintWriter(selectedFile)) {
    // Use writer
}

这有助于意外忘记关闭溪流。