为什么这段代码不能创建文件?

时间:2016-08-03 10:09:24

标签: java file stack-overflow

我试图用这些方法创建文件:

private boolean createFileMain(String path){
    File file = new File(path);
    if(file.isDirectory()){
        return this.createDirectory(file);
    } else if(file.isFile()) {
        return this.createFile(file);
    } else {
        return false;
    }
}

private boolean createFile(File file){
    if(!file.exists()){
        if(file.getParentFile().exists()){
            try{
                if(file.createNewFile()){
                    return true;
                }
            }catch(IOException e){
                return false;
            }
        } else {
            if(this.createDirectory(file)){
                this.createFile(file);
            } else {
                return false;
            }
        }
    }
    return true;
}

private boolean createDirectory(File file){
    if(!file.exists()){
        if(file.mkdirs()){
            return true;
        }
        return false;
    }
    return true;
}

文件的路径:

  

/用户/用户名/目录/账户/

     

/Users/username/Directory/Srcs/file1.txt

     

/Users/username/Directory/file2.txt

当我尝试运行此方法时,以下方法会抛出StackOverFlowError

public void writeInFile(String path, List<String> content) {
    if ((new File(path)).exists()) {
        try {
            writer = new PrintWriter(path, "ASCII");
            for (String contentItem : content) {
                writer.println(contentItem);
            }
            writer.close();
        } catch (FileNotFoundException e1) {
            //DO STUFF
        } catch (UnsupportedEncodingException e) {
            //DO STUFF
        }
    } else {
        this.createFileMain(path);
        this.writeInFile(path, content);
    }

为什么没有创建文件?

3 个答案:

答案 0 :(得分:2)

您是否在isDirectory()等上阅读过JavaDocs?对于isDirectory(),它说:

  当且仅当此抽象路径名表示的文件存在并且是目录时,

才返回true;否则是假的

因此,如果目录不存在,则会出现错误,并且不会创建一个。然后继续尝试编写,创建和编写等,直到得到StackOverFlowError。

要修复stackoverflow,您应该检查创建文件的返回值,例如

boolean created = this.createFileMain(path);
if( created ) {
  this.writeInFile(path, content);
}

要修复文件/目录创建,您需要检查文件是否已存在,否则创建它(也可选择通过file.getParentFile().mkdirs()创建父目录)。

问题是您应该知道是否要创建文件或目录,因为您无法仅通过名称来判断该路径是否是目录或文件名(除非您发明了一些标记,例如始终使用分隔符结束目录路径或要求文件始终具有扩展名。如果你想编写一些你需要创建文件的内容,目录会再次破坏你的代码。

答案 1 :(得分:0)

private boolean createFile(File file) {
    if(!file.exists()) {
        if(file.getParentFile().exists()) {
            // ...
        } else { // In this case, neither file nor its parent exist
            if(this.createDirectory(file)) {
                this.createFile(file); // HERE, you're calling the same method again
            } else {
                // ...;
            }
        }
    }
    return true;
}

我认为您要将标有HERE的行替换为this.createFile(file.getParentFile());。这里发生的事情是你的函数以相同的参数递归调用自身,所以什么都没发生,你的程序陷入循环,直到它耗尽堆栈内存。

答案 2 :(得分:0)

您的createFileMain仅创建已存在的文件。

您不需要创建要写入的文件,您只需要将其写入目录。

public void writeInFile(String path, List<String> content) {
    File file = new File(path);
    File parent = file.getParentFile();
    if (parent != null && !parent.exists())
        parent.mkdirs();

    try (PrintWriter writer = new PrintWriter(path, "ASCII")) {
        for (String contentItem : content) {
            writer.println(contentItem);
        }
        writer.close();
    } catch (IOException e1) {
        //DO STUFF
    }
}