Java 多次使用“新文件”的内存

Java 多次使用“新文件”的内存,java,memory-management,new-operator,Java,Memory Management,New Operator,我正在尝试编写一个函数,该函数将采用项目名称的字符串表示形式,并尝试创建具有匹配名称的文件夹。如果这样一个文件夹已经存在,我想创建一个同名并后跟-1的文件夹,或者如果-1版本已经存在,它将创建一个-2版本 例如,如果项目名称为CandyMachine,则该文件夹将被称为CandyMachine。如果该名称的文件夹已经存在,它将尝试创建一个名为CandyMachine-1的文件夹。如果CandyMachine-1已经存在,那么它将尝试创建一个名为CandyMachine-2的文件夹,等等 以下是我

我正在尝试编写一个函数,该函数将采用项目名称的字符串表示形式,并尝试创建具有匹配名称的文件夹。如果这样一个文件夹已经存在,我想创建一个同名并后跟-1的文件夹,或者如果-1版本已经存在,它将创建一个-2版本

例如,如果项目名称为CandyMachine,则该文件夹将被称为CandyMachine。如果该名称的文件夹已经存在,它将尝试创建一个名为CandyMachine-1的文件夹。如果CandyMachine-1已经存在,那么它将尝试创建一个名为CandyMachine-2的文件夹,等等

以下是我迄今为止已经实现的代码:

private static String getOutputPath(String projName){
    String newPath = "Projects" + File.separator + projName;


    File pathFile = new File(newPath);

    if(pathFile.exists()){
        int i = 1;
        while(pathFile.exists()){
            pathFile = new File(newPath + "-" + i);
            i++;
        }

        newPath += "-" + Integer.toString(i);
        newPath += File.separator + "src";
        return newPath;
    }
    else
        return newPath;
}

关于上述代码,我的问题是,如果在while循环中重复创建新的文件对象,是否可能导致内存泄漏?如果是这样的话,我怎样才能避免呢?据我所知,我无法更改已存在文件对象的路径。有没有更好的方法来检查我要检查的内容?

等一下,当输入参数只有一个表示项目名称的字符串时,为什么需要while循环 与其在所有文件上迭代while循环以查找是否使用了令牌,不如将其分为两步,第一步中,您有一个FileNameFilter,它列出所有文件,从项目名称开始,然后处理文件名以创建适当的目录

File dir = new File("Projects" + File.separator + projName);
String[] foundFiles = dir.listFiles(new FilenameFilter() {
boolean accept(File dir, String name) {
    return name.startsWith(projName);
}
});

for (String filename : foundFiles) {
   // Process filename by finding the maximum token after project name and creating the directory based on the last found token +1
}  
关于上述代码,我的问题是,如果在while循环中重复创建新的文件对象,是否可能导致内存泄漏

不可以。只要引用不在范围内,它就有资格进行垃圾收集。因此,您创建的所有文件对象最终都将被垃圾收集

现在,2014年还有一个更基本的问题:不再使用文件,使用路径。下面是您将如何使用更新且更好的文件API编写代码:

private static final Path PROJECT_DIR = Paths.get("Projects");

// ...

private static String getOutputPath(final String projName)
{
    Path ret = PROJECT_DIR.resolve(projName);
    int index = 1;

    while (Files.exists(ret))
        ret = PROJECT_DIR.resolve(projName + '-' + index++);

    return ret.toString();
}

当然,这个代码可以大大改进;例如,只检查路径是否存在,而不检查路径是否实际是目录、常规文件甚至是符号链接是的,新API可以检测到这一点;文件无法保存。

不会出现内存泄漏或内存不足的情况。内存泄漏,不会。但可能是该文件正在使用操作系统资源。我自己也不确定。在执行新的File语句时,旧的File对象将被取消引用并接受垃圾收集。您将受到操作系统文件系统约束的限制。嗯,您是否仍然使用Java 6或更少?如果没有,考虑使用路径instead@Radiodef可能是该文件正在使用操作系统资源——不,不会。正如javadoc所提到的,文件是一个抽象路径名。但同样,如果您使用Java 7或更高版本,您应该放弃文件而使用路径。您的答案应该是注释。OP实际上解释了循环的用途。我希望它迭代,直到找到一个新的数字。因此,如果有4个名为CandyMachine的项目,则它将迭代,直到发现CandyMachine-4未被采用,并将其作为正确的路径返回。@Jdm2010:有趣的是,在初始查看时没有捕捉到它。