Keith Kornacki
Keith Kornacki

Reputation: 3

Java file.exists() Errors

I am currently working on a "Notepad - type" file for my Object-Oriented Java class. I've got most of the program done - however I am stuck on the following issue:

When the program tries to save a file, it is supposed to first check for a files existence, obviously if the file exists the program will prompt the user for permission to overwrite the existing copy of the file [The overwrite prompt is not written yet, but it will go in the if(selectedFile.exists() == true) portion of code] - and if the file does not exist, the program will create it.

The issue I am having is that the program always creates the file before checking for the files existence. I have looked at probably 20-30+ answers to similar questions - mainly on stackoverflow, and have yet to come across the answer i need. I'm not sure if I am just "not getting it", or if I have really done something wrong..

Any answer - or hint as to where to find the answer - to this issue would be greatly appreciated.

Thank You.

Complete code (for the save portion of the program is shown below).

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

Upvotes: 0

Views: 176

Answers (3)

Christian Hujer
Christian Hujer

Reputation: 17945

You do:

 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

By the way, your code is far too complicated. Instead of having the variables selectedFile and newFile, which both are newly created File objects, you could simply use the File object returned by the dialog: newFile = fileChooser.getSelectedFile().

if(selectedFile.exists() == true)

can be simplified to

if (selectedFile.exists())

I recommend to do I/O using try-with-resources whenever possible:

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

This helps with accidentally forgetting to close streams.

Upvotes: 0

khelwood
khelwood

Reputation: 59103

Don't create the PrintWriter before checking if the file exists. The PrintWriter is what causes the file to be written to.

Upvotes: 0

VGR
VGR

Reputation: 44308

You are calling new PrintWriter(selectedFile), which creates the file, right before you check whether selectedFile exists.

Upvotes: 1

Related Questions