Java - создать новый каталог с помощью mkdir ()? [Дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

296
задан Benjamin 28 December 2013 в 13:51
поделиться

18 ответов

Через ~ 7 лет я обновлю его на лучший подход, предложенный Божо.

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

Устаревший:

File theDir = new File("new folder");

// if the directory does not exist, create it
if (!theDir.exists()) {
    System.out.println("creating directory: " + theDir.getName());
    boolean result = false;

    try{
        theDir.mkdir();
        result = true;
    } 
    catch(SecurityException se){
        //handle it
    }        
    if(result) {    
        System.out.println("DIR created");  
    }
}
357
ответ дан Jigar Joshi 17 August 2018 в 16:40
поделиться
  • 1
    -1: Это фактически очень плохой метод для создания каталога. Доступ к FS не зарезервирован для выделенного ресурса. Между if(!theDir.exists()) и theDir.mkdir() статус мог быть изменен, а также он мог измениться между , а не , создавая каталог (из-за exists, возвращающего true) и нуждающегося в нем. Результат метода exists никогда не должен использоваться, чтобы решить, создать ли каталог или нет. Просто позвоните mkdir, никакое исключение не будет выбрано, если оно уже существует. – mwhs 24 November 2013 в 13:26
  • 2
    @mwhs Я понимаю, что лучше не проверять каталог, но я не понимаю вашего оправдания (вторая часть). Невозможно изменить статус между вызовом mkdir и необходимостью в этом каталоге? Я предполагаю, что вы имели в виду, что какой-то другой процесс удаляет каталог. – Episodex 17 July 2015 в 12:54
  • 3
    Директивы @Episodex - это общие ресурсы. Просто не используйте вышеуказанное решение, это неправильно по разным причинам. Неясно, как PO мог подумать, что это правильный ответ. Если вам нужны утверждения о ресурсах IO, вам нужно использовать блокировки, а не логические значения. – mwhs 20 July 2015 в 09:27
  • 4
    @mhws Я знаю, что это сообщение пару месяцев назад, но если вы посмотрите на реализацию mkdirs, из исходного кода, первое, что вызывается, - if (exists()) { return false; }. Сама реализация сначала проверяет, существует ли каталог, так что единственное, на что этот ответ виноват, возможно, проверяет это условие 2x. Не так плохо, как вы это делаете. – Michael Hogenson 12 November 2015 в 21:59
  • 5
    Начиная с Java 7, вероятно, вы должны использовать методы в Files, как в более позднем ответе Benoit Blanchon. (Этот ответ, похоже, был написан до Java 7.) – Brick 8 September 2016 в 16:58

Вы также можете ссылаться на функцию makdir () для создания нового каталога в папке, где вы хотите.

-7
ответ дан arun 17 August 2018 в 16:40
поделиться
  • 1
    Нет метода с именем makdir. Если вы имели в виду mkdir, как это добавляет что-либо к существующим ответам? – Ted Hopp 21 October 2012 в 07:27
  1. Создайте единый каталог.
    new File("C:\\Directory1").mkdir();
    
  2. Создайте каталог с именем «Directory2» и все его подкаталоги «Sub2» и «Sub-Sub2» вместе.
    new File("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()
    

Источник: этот совершенный учебник , вы также найдете пример использования.

17
ответ дан AsifAli72090 17 August 2018 в 16:40
поделиться

Хотя на этот вопрос был дан ответ. Я хотел бы добавить что-то лишнее, т. Е. Если существует файл с именем каталога, которое вы пытаетесь создать, чем он должен вызывать ошибку. Для будущих посетителей.

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");
        }
    }
}
4
ответ дан bdean20 17 August 2018 в 16:40
поделиться
  • 1
    Как упоминалось в комментарии от @mwhs о ответе Джигара Джоши, проверка на существование сначала не только не нужна, но и на самом деле плохая идея. – Bdoserror 25 November 2014 в 21:57

С помощью Java 7 вы можете использовать Files.createDirectories() .

Например:

Files.createDirectories(Paths.get("/path/to/directory"));
108
ответ дан Benoit Blanchon 17 August 2018 в 16:40
поделиться
  • 1
    Я думаю, что этот вариант не существовал во время оригинального Q & amp; A, но это должно быть ответом в будущем, я думаю. – Brick 8 September 2016 в 16:56
  • 2
    Было бы также приятно отметить, что: Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists – Keith OYS 12 November 2017 в 12:23
  • 3
    Спасибо, что указали разницу btw createDirectory и createDirectories. Я считаю, что это плохой выбор именования. – seinecle 6 June 2018 в 12:28

Эта функция позволяет вам создать каталог в домашнем каталоге пользователя.

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");
    }
}
0
ответ дан Boubakr 17 August 2018 в 16:40
поделиться
  • 1
    Как упоминалось в комментарии от @mwhs о ответе Джигара Джоши, проверка на существование сначала не только не нужна, но и на самом деле плохая идея. – Bdoserror 25 November 2014 в 21:58
new File("/path/directory").mkdirs();

Здесь «каталог» - это имя каталога, который вы хотите создать / существующего.

423
ответ дан Bozho 17 August 2018 в 16:40
поделиться
  • 1
    да, в приведенном выше примере directory - это имя. – Bozho 3 September 2010 в 11:36
  • 2
    Гораздо лучший ответ, чем тот, который выбран OP правильно. Проверка наличия каталога перед его созданием должна стать известным анти-шаблоном. – mwhs 24 November 2013 в 13:30
  • 3
    что, если каталог уже существует? Это будет переписывание? или пропустить процесс. – Avinash Raj 8 October 2015 в 05:34
  • 4
    @AvinashRaj, пожалуйста, проверьте docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs () – Tascalator 22 October 2015 в 01:12
  • 5
    это ясно: Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise – Xerus 11 June 2017 в 15:29

mkdir vs mkdirs


Если вы хотите создать один каталог, используйте mkdir

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

Если вы хотите создать иерархию структуры папок, используйте mkdirs

 new File("/path/directory").mkdirs();
21
ответ дан Burusothman 17 August 2018 в 16:40
поделиться
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();
       }

    }
}
-2
ответ дан Fathah Rehman P 17 August 2018 в 16:40
поделиться
  • 1
    Как упоминалось в комментарии от @mwhs о ответе Джигара Джоши, проверка на существование сначала не только не нужна, но и на самом деле плохая идея. – Bdoserror 25 November 2014 в 21:57

Следующий метод должен делать то, что вы хотите, просто убедитесь, что вы проверяете возвращаемое значение 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();
    }
}
6
ответ дан Jon Freedman 17 August 2018 в 16:40
поделиться
  • 1
    Как упоминалось в комментарии от @mwhs о ответе Джигара Джоши, проверка на существование сначала не только не нужна, но и на самом деле плохая идея. – Bdoserror 25 November 2014 в 21:56

попробуйте с этим.

import java.io.File;

public class MakingDirectory {
 public static void main(String[] args) {
      String s="d:\\msreddy\\sample1";
      File file=new File(s);
      file.mkdirs();
}
}

для получения дополнительной информации см. this.

2
ответ дан madhu 17 August 2018 в 16:40
поделиться

Для java 7 и выше:

Path path = Paths.get("/your/path/string");
if(!Files.exists(path)) {
    try {
      Files.createDirectories(path);
    } catch (IOException e) {
      e.printStackTrace();
    }
}
5
ответ дан Marcos Maia 17 August 2018 в 16:40
поделиться

Просто хотел указать всем, кто звонил File.mkdir() или File.mkdirs(), чтобы быть осторожным, File - это каталог, а не файл. Например, если вы вызываете mkdirs() для пути /dir1/dir2/file.txt, он создаст папку с именем file.txt, которая, вероятно, не то, что вы хотели. Если вы создаете новый файл и хотите автоматически создавать родительские папки, вы можете сделать что-то вроде этого:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }
3
ответ дан Matt Bonness 17 August 2018 в 16:40
поделиться

Чистый и чистый:

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!");
            }
        }

    }
}
3
ответ дан Ripon Al Wasim 17 August 2018 в 16:40
поделиться

Хорошо, чтобы создать каталог / папку в java, у нас есть два метода

Здесь метод makedirectory создает единый каталог, если он не существует.

File dir = new File("path name");
boolean isCreated = dir.mkdir();

И

File dir = new File("path name");
boolean isCreated = dir.mkdirs();

Здесь метод makedirectories создаст все каталоги, отсутствующие в пути, который представляет файл.

Например, ссылку ниже (объясняется очень хорошо). Надеюсь, поможет!! http://www.flowerbrackets.com/create-directory-java-program/

2
ответ дан Shiva 17 August 2018 в 16:40
поделиться

Это для меня работает один или несколько каталогов: нужно импортировать java.io.File; / * введите код ниже, чтобы добавить diectory 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");  }
1
ответ дан Stefano Castagnino 17 August 2018 в 16:40
поделиться

Вы можете попробовать FileUtils # forceMkdir

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

В этой библиотеке есть много полезных функций.

37
ответ дан Suzana 17 August 2018 в 16:40
поделиться
  • 1
    Гораздо лучше, чем чистые mkdirs: обрабатывает параллелизм, проверяет, удалось ли выполнить операцию, проверяет, существует ли каталог (а не файл!). – Andrey 6 May 2015 в 11:26

, если вы хотите убедиться в его создании, то это:

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();
}

beacuse mkDir() возвращает логическое значение, и findbugs будут плакать, если вы не используете эту переменную. Также его не очень приятно ...

mkDir() возвращает true, если mkDir() создает его. Если dir существует, он возвращает false, поэтому для проверки созданного вами каталога вызывается только exists(), если mkDir() возвращает false.

assertThat() проверяет результат и терпит неудачу, если exists() возвращает ложный. ofc вы можете использовать другие вещи для обработки несозданного каталога.

0
ответ дан Virb 17 August 2018 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: