ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Java 中创建目录?

如何创建目录/文件夹?

一旦我测试了 System.getProperty("user.home");

当且仅当新文件夹不存在时,我必须创建一个目录(目录名称“新文件夹”)。

请检查您选择的正确答案。 JigarJoshi 提出的解决方案具有误导性。它没有正确解决问题(请参阅我的评论)。 Bozho 提出的(简单)解决方案要好得多。
mkdir 在 java 中是幂等的。该实现将为您检查目录是否存在,并且仅在它不存在时创建它。

B
Bozho
new File("/path/directory").mkdirs();

这里的“目录”是您要创建/存在的目录的名称。


比 OP 选择的正确答案要好得多。在创建目录之前检查目录是否存在应该成为众所周知的反模式。
如果目录已经存在怎么办?它会覆盖吗?或跳过该过程。
很明显:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
它不会覆盖现有目录。它将返回错误。
p
paradocslover

大约 7 年后,我会将其更新为 Bozho 建议的更好方法。

File theDir = new File("/path/directory");
if (!theDir.exists()){
    theDir.mkdirs();
}

-1:这实际上是一种创建目录的非常糟糕的技术。对 FS 的访问不保留给专用资源。在 if(!theDir.exists())theDir.mkdir() 之间,状态可能发生了变化,也可能在 not 创建目录(因为 exists 返回 true)和需要它之间发生变化。方法 exists 的结果绝不应该用于决定是否创建目录。只需调用mkdir,如果已经存在则不会抛出异常。
@mwhs 我知道最好不要检查目录,但我不明白你的理由(第二部分)。调用 mkdir 和需要目录之间的状态不能改变吗?我假设您的意思是其他一些进程删除了该目录。
@Episodex 目录是共享资源。只是不要使用上述解决方案,由于不同的原因,它是错误的。不清楚 PO 怎么会认为这是正确的答案。如果你想要关于 IO 资源的断言,你需要使用锁,而不是布尔值。
@mhws 我知道这篇文章已有几个月的历史,但是如果您从源代码中查看 mkdirs 实现,首先调用的是 if (exists()) { return false; }。实现本身首先检查目录是否已经存在,所以这个答案的唯一错误可能是检查条件 2x。没有你想象的那么糟糕。
从 Java 7 开始,您可能应该使用 Files 中的方法,就像 Benoit Blanchon 最近的回答一样。 (这个答案似乎是在 Java 7 之前编写的。)
B
Benoit Blanchon

对于 Java 7,您可以使用 Files.createDirectories()

例如:

Files.createDirectories(Paths.get("/path/to/directory"));

我认为这个选项在最初的问答时不存在,但我认为这应该是未来的答案。
还需要注意的是:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
感谢您指出 createDirectory 和 createDirectories 的区别。我发现这是一个糟糕的命名选择。
(2019) 我使用了 Files.createDirectory(Paths.get(directory.toString()));其中目录是一个文件对象。不要忘记捕捉你的 IOException
@chrips 最好这样做 directory.toPath()
S
Suzana

你可以试试FileUtils#forceMkdir

FileUtils.forceMkdir("/path/directory");

这个library有很多有用的功能。


比纯 mkdirs 好得多:处理并发,检查操作是否成功,检查目录(不是文件!)是否存在。
它在哪里说它处理并发?在阅读本文之前,我实际上试图找到它,寻找一种让多个线程操作文件系统而不会搞砸的方法。
使用 source 卢克
B
Bruce

mkdir 与 mkdirs

如果要创建单个目录,请使用 mkdir

new File("/path/directory").mkdir();

如果要创建文件夹结构的层次结构,请使用 mkdirs

 new File("/path/directory").mkdirs();

y
youpilat13

创建一个目录。 new File("C:\\Directory1").mkdir();创建一个名为“Directory2”的目录及其所有子目录“Sub2”和“Sub-Sub2”。新文件("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()

来源:这个完美的 tutorial ,您也可以找到一个使用示例。


g
groo

对于 Java 7 及更高版本:

Path path = Paths.get("/your/path/string");
Files.createDirectories(path);

在创建 from createDirectories javadocs 之前似乎没有必要检查目录或文件是否存在:

通过首先创建所有不存在的父目录来创建目录。与 createDirectory 方法不同,如果由于目录已存在而无法创建目录,则不会引发异常。 attrs 参数是可选的文件属性,用于在创建不存在的目录时自动设置。每个文件属性都由其名称标识。如果数组中包含多个同名属性,则忽略除最后一次出现的所有属性。如果此方法失败,则它可能会在创建一些(但不是全部)父目录后这样做。


J
Jon Freedman

下面的方法应该做你想做的事,只要确保你正在检查 mkdir() / mkdirs() 的返回值

private void createUserDir(final String dirName) throws IOException {
    final File homeDir = new File(System.getProperty("user.home"));
    final File dir = new File(homeDir, dirName);
    if (!dir.exists() && !dir.mkdirs()) {
        throw new IOException("Unable to create " + dir.getAbsolutePath();
    }
}

正如@mwhs 对 Jigar Joshi 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是一个坏主意。
R
Ripon Al Wasim

干净整洁:

import java.io.File;

public class RevCreateDirectory {

    public void revCreateDirectory() {
        //To create single directory/folder
        File file = new File("D:\\Directory1");
        if (!file.exists()) {
            if (file.mkdir()) {
                System.out.println("Directory is created!");
            } else {
                System.out.println("Failed to create directory!");
            }
        }
        //To create multiple directories/folders
        File files = new File("D:\\Directory2\\Sub2\\Sub-Sub2");
        if (!files.exists()) {
            if (files.mkdirs()) {
                System.out.println("Multiple directories are created!");
            } else {
                System.out.println("Failed to create multiple directories!");
            }
        }

    }
}

b
bdean20

虽然这个问题已经回答了。我想补充一些额外的内容,即如果存在一个具有您尝试创建的目录名称的文件,那么它应该会提示错误。对于未来的访客。

public static void makeDir()
{
    File directory = new File(" dirname ");
    if (directory.exists() && directory.isFile())
    {
        System.out.println("The dir with name could not be" +
        " created as it is a normal file");
    }
    else
    {
        try
        {
            if (!directory.exists())
            {
                directory.mkdir();
            }
            String username = System.getProperty("user.name");
            String filename = " path/" + username + ".txt"; //extension if you need one

        }
        catch (IOException e)
        {
            System.out.println("prompt for error");
        }
    }
}

正如@mwhs 对 Jigar Joshi 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是一个坏主意。
M
Matt

只是想向所有调用 File.mkdir()File.mkdirs() 的人指出要小心 File 对象是目录而不是文件。例如,如果您为路径 /dir1/dir2/file.txt 调用 mkdirs(),它将创建一个名为 file.txt文件夹,这可能不是您想要的。如果您正在创建一个新文件并且还想自动创建父文件夹,您可以执行以下操作:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }

S
Stefano Castagnino

这种方式对我来说是一个或多个目录或它们:需要导入 java.io.File; /*输入下面的代码添加目录dir1或检查是否存在dir1,如果不存在,则创建它,与dir2和dir3相同*/

    File filed = new File("C:\\dir1");
    if(!filed.exists()){  if(filed.mkdir()){ System.out.println("directory is created"); }} else{ System.out.println("directory exist");  }

    File filel = new File("C:\\dir1\\dir2");
    if(!filel.exists()){  if(filel.mkdir()){ System.out.println("directory is created");   }} else{ System.out.println("directory exist");  }

    File filet = new File("C:\\dir1\\dir2\\dir3");
    if(!filet.exists()){  if(filet.mkdir()){ System.out.println("directory is  created"); }}  else{ System.out.println("directory exist");  }

V
Virb

如果你想确定它的创建,那么这个:

final String path = "target/logs/";
final File logsDir = new File(path);
final boolean logsDirCreated = logsDir.mkdir();
if (!logsDirCreated) {
    final boolean logsDirExists = logsDir.exists();
    assertThat(logsDirExists).isTrue();
}

因为 mkDir() 返回一个布尔值,如果您不使用该变量,findbugs 会为它哭泣。而且也不好看...

mkDir() 仅在 mkDir() 创建它时返回 true。如果目录存在,则返回 false,因此要验证您创建的目录,仅在 mkDir() 返回 false 时调用 exists()

assertThat() 将检查结果并在 exists() 返回 false 时失败。 ofc 你可以使用其他东西来处理未创建的目录。


B
Bouba

此功能允许您在用户主目录上创建目录。

private static void createDirectory(final String directoryName) {
    final File homeDirectory = new File(System.getProperty("user.home"));
    final File newDirectory = new File(homeDirectory, directoryName);
    if(!newDirectory.exists()) {
        boolean result = newDirectory.mkdir();

        if(result) {
            System.out.println("The directory is created !");
        }
    } else {
        System.out.println("The directory already exist");
    }
}

正如@mwhs 对 Jigar Joshi 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是一个坏主意。
F
Fathah Rehman P
public class Test1 {
    public static void main(String[] args)
    {
       String path = System.getProperty("user.home");
       File dir=new File(path+"/new folder");
       if(dir.exists()){
           System.out.println("A folder with name 'new folder' is already exist in the path "+path);
       }else{
           dir.mkdir();
       }

    }
}

正如@mwhs 对 Jigar Joshi 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是一个坏主意。