gpt4 book ai didi

java - 多次使用 "new File"的内存

转载 作者:行者123 更新时间:2023-12-01 06:15:08 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数将采用项目名称的字符串表示形式,并尝试创建具有匹配名称的文件夹。如果这样的文件夹已经存在,我想创建一个同名的文件夹,后跟“-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 循环中重复创建新的 File 对象是否可能导致内存泄漏?如果是这样的话,我该如何避免呢?据我所知,我无法更改已存在的 File 对象的路径。有没有更好的方法来检查我想要检查的内容?

最佳答案

My question regarding the above code is if I can potentially cause a memory leak by repeatedly creating new File objects within the while loop?

没有。只要引用超出范围,它就有资格进行垃圾回收。因此,您创建的所有 File 对象最终都将被垃圾回收。

现在,还有一个在 2014 年更为根本的问题:不要再使用 File,而使用 Path。以下是使用更新且更好的文件 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();
}

当然,这段代码还可以大大改进;例如,仅检查路径是否存在,而不检查路径是否实际上是目录、常规文件甚至符号链接(symbolic link)(是的,新 API 可以检测到;File 不能)。

关于java - 多次使用 "new File"的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com