我目前正在制作"记事本 - 类型"我的面向对象的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);
}
}
答案 0 :(得分:1)
在您检查new PrintWriter(selectedFile)
是否存在之前,您正在调用selectedFile
来创建文件。
答案 1 :(得分:0)
在检查文件是否存在之前,请勿创建PrintWriter
。 PrintWriter
是导致文件写入的原因。
答案 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对象,而不是让变量selectedFile
和newFile
都是新创建的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
}
这有助于意外忘记关闭溪流。