所以,我在文件上遇到了困难。我以前用过文件,但这次他们很痛苦。
public SaveFile(File newFile)
{
this.file = newFile;
boolean first = false;
if(!file.exists()){
file.mkdir();
first = true;
}
if(file.isDirectory()){
throw new IllegalStateException("Save file can not be a folder");
}
if(file.getName().equalsIgnoreCase("current")){
first = false;
}
this.config = YamlConfiguration.loadConfiguration(this.file);
String name = file.getName();
name = name.substring(0, name.lastIndexOf("."));
if(first){
config.set("name", name);
config.set("health", 20.0F);
config.set("level", 0);
}
try {
config.save(file);
} catch (IOException e) {
e.printStackTrace();
}
}
当我创建一个保存文件时,它没有问题。我可以查看和编辑文件,这很棒。但是,如果我尝试创建第二个SaveFile,它会将NEW文件转换为文件夹并抛出IllegalStateException
它的外观如下:
public static void main(String[] args){
SaveFile robert = new SaveFile(new File(SaveFile.getSaveFolder(), "Robert.save"));
SaveFile james = new SaveFile(new File(SaveFile.getSaveFolder(), "James.save");
}
SaveFile robert 已创建,看起来应该如此。 SaveFile james 创建为文件夹,并抛出IllegalStateException
答案 0 :(得分:2)
显然,您正在尝试在父目录中创建文件,并且要检查父目录是否存在,并在需要时首先创建它。
您需要获取您传递的文件的父级,这是您可能想要使用File#getParentFile()创建的目录。此方法返回一个巫婆的File对象,您必须调用File#mkdirs()。
你可以像这样继续下去:
public void saveFile(File newFile)
{
File file = newFile;
if(! file.exists()){
File dir = file.getParentFile();
if(! dir.exists()) {
if(dir.mkdirs()) {
System.out.println("parent directory "
+ dir.getPath() + " created");
}
if(! dir.isDirectory()){
throw new IllegalStateException("Unable to create directory "
+ dir.getPath());
}
}
} else {
if(file.isDirectory()){
throw new IllegalStateException("Save file can not be a folder");
}
}
// ...
System.out.println("Save file " + file.getPath() + " created");
}
答案 1 :(得分:0)
我认为您的问题就在这里,正如我的代码评论所述:
boolean first = false;
if(!file.exists()){
// the following line is turning the file into a directory if the file
// doesn't already exist
file.mkdir();
first = true;
}
// now you are checking if the directory you just created is a directory
// (this will, of course, be true) and thus throw the exception
if(file.isDirectory()){
throw new IllegalStateException("Save file can not be a folder");
}
所以看起来像#34; Robert.save"存在,因而有效,但是" James.save"并不是因为它被创建为目录。
答案 2 :(得分:0)
这与这行代码有关:
file.mkdir();
,它使您作为参数传递的File
对象的路径之外的目录。因此,如果在执行之前不存在任何文件(Robert.save
和James.save
),它将创建两个名为/your/path/Robert.save
和/your/path/James.save
的目录。
它只创建一个目录的事实可能只是由于在执行代码之前Robert.save
可能已经存在的事实。因此,不会调用mkDir
方法,因为未验证以下条件:
if(!file.exists())