Làm thế nào để tạo một thư mục trong Java?


387

Làm cách nào để tạo Thư mục / thư mục?

Khi tôi đã thử nghiệm System.getProperty("user.home");

Tôi phải tạo một thư mục (tên thư mục "thư mục mới") nếu và chỉ khi thư mục mới không tồn tại.


24
vui lòng xem lại lựa chọn của bạn về câu trả lời đúng. Giải pháp được đề xuất bởi JigarJoshi là sai lệch. Nó không giải quyết vấn đề chính xác (xem bình luận của tôi). Giải pháp (đơn giản) do Bozho đề xuất là tốt hơn nhiều.
mwhs

mkdirlà idempotent trong java. Việc thực hiện sẽ kiểm tra xem thư mục có tồn tại cho bạn không và chỉ tạo nó nếu nó không tồn tại.
mwhs 21/07/2015

Câu trả lời:


461

Sau ~ 7 năm, tôi sẽ cập nhật nó để tiếp cận tốt hơn được đề xuất bởi Bozho.

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

Không dùng nữa

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

241
-1: Đó thực sự là một kỹ thuật thực sự tồi để tạo một thư mục. Quyền truy cập vào FS không được dành riêng cho một tài nguyên chuyên dụng. Giữa if(!theDir.exists())theDir.mkdir()trạng thái có thể đã thay đổi, cũng như nó có thể thay đổi ở giữa việc không tạo thư mục (vì existstrả lại true) và cần nó. Kết quả của phương thức existskhông bao giờ được sử dụng để quyết định thời tiết có tạo thư mục hay không. Chỉ cần gọi mkdir, không có ngoại lệ sẽ được ném nếu nó đã tồn tại.
mwhs

4
@mwhs Tôi hiểu rằng tốt hơn hết là không kiểm tra thư mục nhưng tôi không hiểu lời biện minh của bạn (phần thứ hai). Không thể thay đổi trạng thái giữa gọi mkdirvà cần thư mục? Tôi giả sử bạn có nghĩa là một số quá trình khác xóa thư mục.
Episodex

2
@Episodex Thư mục là tài nguyên được chia sẻ. Chỉ cần không sử dụng giải pháp trên, nó sai vì những lý do khác nhau. Không rõ làm thế nào PO có thể nghĩ rằng đây là câu trả lời chính xác. Nếu bạn muốn xác nhận về tài nguyên IO, bạn cần sử dụng khóa chứ không phải booleans.
mwhs 20/07/2015

44
@mhws Tôi biết bài đăng này là một vài tháng tuổi nhưng nếu bạn nhìn vào việc mkdirsthực hiện, từ mã nguồn, điều đầu tiên được gọi là if (exists()) { return false; }. Bản thân việc triển khai sẽ kiểm tra xem thư mục đã tồn tại chưa, vì vậy điều duy nhất câu trả lời này có lỗi là, có lẽ, là kiểm tra điều kiện đó 2 lần. Không tệ như bạn đang làm.
Michael Hogenson

5
Kể từ Java 7, có lẽ bạn nên sử dụng các phương thức Filesnhư trong câu trả lời gần đây hơn của Benoit Blanchon. (Câu trả lời này dường như đã được viết trước Java 7.)
Brick

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

Ở đây "thư mục" là tên của thư mục bạn muốn tạo / tồn tại.


30
Câu trả lời tốt hơn nhiều so với câu trả lời được chọn bởi OP. Kiểm tra sự tồn tại của thư mục trước khi tạo nó sẽ trở thành một mô hình chống nổi tiếng.
mwhs

7
Nếu thư mục đã tồn tại thì sao? Nó sẽ ghi đè? hoặc bỏ qua quá trình.
Avinash Raj


1
@Tascalator nó không rõ ràng từ tài liệu bạn có thể xây dựng? Ngoài ra câu trả lời nên được bổ sung với câu trả lời cho what if the directory is already exists? It would do overwriting? or skip the process.câu hỏi.
mrgloom

3
rõ ràng:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

147

Với Java 7, bạn có thể sử dụng Files.createDirectories().

Ví dụ:

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

12
Tôi nghĩ rằng tùy chọn này không tồn tại vào thời điểm Q & A ban đầu, nhưng đây sẽ là câu trả lời trong tương lai.
Gạch

6
Cũng cần lưu ý rằng:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS

Cảm ơn bạn đã chỉ ra sự khác biệt btw createdDirectory và createdDirectories. Tôi thấy đó là một sự lựa chọn đặt tên kém.
seinecle

(2019) Tôi đã sử dụng Files.createDirectory (Paths.get (thư mục.toString ())); trong đó thư mục là một đối tượng File. Đừng quên bắt IOException của bạn
trò chuyện

@chrips Tốt hơn là nên làm directory.toPath()sau đó.
Ruslan Stelmachenko

37

Bạn có thể thử FileUtils # forceMkdir

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

Thư viện này có rất nhiều chức năng hữu ích.


1
Tốt hơn nhiều so với mkdirs thuần túy: xử lý đồng thời, kiểm tra xem thao tác có thành công hay không, kiểm tra xem thư mục (không phải tệp!) Có tồn tại không.
Andrey

29

mkdir vs mkdirs


Nếu bạn muốn tạo một thư mục sử dụng mkdir

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

Nếu bạn muốn tạo một cấu trúc phân cấp của cấu trúc thư mục, hãy sử dụng mkdirs

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

22
  1. Tạo một thư mục duy nhất.

    new File("C:\\Directory1").mkdir();
  2. Tạo một thư mục có tên là Directory Directory2 và tất cả các thư mục con của nó Sub-Sub và Sub Sub-Sub2 “cùng nhau.

    new File("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()

Nguồn: hướng dẫn hoàn hảo này , bạn cũng tìm thấy một ví dụ về việc sử dụng.


15

Dành cho java 7 trở lên:

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

Dường như không cần thiết phải kiểm tra sự tồn tại của thư mục hoặc tệp trước khi tạo, từ tệp tạo tệp javadocs :

Tạo một thư mục bằng cách tạo tất cả các thư mục cha không tồn tại trước tiên. Không giống như phương thức createDirectory, một ngoại lệ sẽ không được ném nếu thư mục không thể được tạo vì nó đã tồn tại. Tham số attrs là các thuộc tính tệp tùy chọn để đặt nguyên tử khi tạo các thư mục không tồn tại. Mỗi thuộc tính tệp được xác định bởi tên của nó. Nếu có nhiều hơn một thuộc tính cùng tên được bao gồm trong mảng thì tất cả ngoại trừ lần xuất hiện cuối cùng đều bị bỏ qua.

Nếu phương pháp này thất bại, thì nó có thể làm như vậy sau khi tạo một số, nhưng không phải tất cả, các thư mục mẹ.


7

Phương thức sau sẽ làm những gì bạn muốn, chỉ cần đảm bảo rằng bạn đang kiểm tra giá trị trả về của 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();
    }
}

2
Như đã đề cập trong bình luận của @mwhs về câu trả lời của Jigar Joshi, việc kiểm tra sự tồn tại trước tiên không chỉ không cần thiết mà thực sự là một ý tưởng tồi.
Bdoserror

4

Mặc dù câu hỏi này đã được trả lời. Tôi muốn đặt thêm một cái gì đó, tức là nếu có một tệp tồn tại với tên thư mục mà bạn đang cố gắng tạo thì nó sẽ nhắc lỗi. Đối với du khách trong tương lai.

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

3
Như đã đề cập trong bình luận của @mwhs về câu trả lời của Jigar Joshi, việc kiểm tra sự tồn tại trước tiên không chỉ không cần thiết mà thực sự là một ý tưởng tồi.
Bdoserror

4

Gọn gàng và sạch sẽ:

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

    }
}

4

Để tạo thư mục / thư mục trong java, chúng tôi có hai phương thức

Ở đây phương thức makenirectory tạo thư mục đơn nếu nó không tồn tại.

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

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

Ở đây phương thức makenirectories sẽ tạo ra tất cả các thư mục bị thiếu trong đường dẫn mà đối tượng tệp đại diện.

Ví dụ tham khảo liên kết dưới đây (giải thích rất tốt). Hy vọng nó giúp!! https://www.flowerbrackets.com/create-directory-java-program/


3

Chỉ muốn chỉ ra cho mọi người gọi File.mkdir()hoặc File.mkdirs()để cẩn thận Fileđối tượng là một thư mục chứ không phải là một tập tin. Ví dụ, nếu bạn gọi mkdirs()đường dẫn /dir1/dir2/file.txt, nó sẽ tạo một thư mục có tên file.txtkhông phải là thứ bạn muốn. Nếu bạn đang tạo một tệp mới và cũng muốn tự động tạo các thư mục mẹ, bạn có thể làm một cái gì đó như thế này:

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

2

Đây là cách làm việc đối với tôi làm một thư mục đơn trở lên hoặc chúng: cần nhập java.io.File;
/ * nhập mã bên dưới để thêm dir1 diectory hoặc kiểm tra nếu tồn tại dir1, nếu không, vì vậy hãy tạo nó và tương tự với dir2 và 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");  }

0

Chức năng này cho phép bạn tạo một thư mục trên thư mục nhà của người dùng.

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

Như đã đề cập trong bình luận của @mwhs về câu trả lời của Jigar Joshi, việc kiểm tra sự tồn tại trước tiên không chỉ không cần thiết mà thực sự là một ý tưởng tồi.
Bdoserror

0

Nếu bạn muốn chắc chắn nó được tạo thì đây:

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()trả về một boolean và findbugs sẽ khóc cho nó nếu bạn không sử dụng biến. Ngoài ra nó không đẹp ...

mkDir()chỉ trả về true nếu mkDir()tạo nó. Nếu thư mục tồn tại, nó trả về false, vì vậy để xác minh thư mục bạn đã tạo, chỉ gọi exists()nếu mkDir()trả về false.

assertThat()sẽ kiểm tra kết quả và không thành công nếu exists()trả về false. Bạn có thể sử dụng những thứ khác để xử lý thư mục chưa được xử lý.


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

    }
}

Như đã đề cập trong bình luận của @mwhs về câu trả lời của Jigar Joshi, việc kiểm tra sự tồn tại trước tiên không chỉ không cần thiết mà thực sự là một ý tưởng tồi.
Bdoserror

-7

Bạn cũng có thể tham khảo hàm makdir () để tạo thư mục mới trong thư mục mà bạn muốn.


9
Không có phương pháp được đặt tên makdir. Nếu bạn có ý nghĩa mkdir, làm thế nào để thêm bất cứ điều gì vào câu trả lời hiện có?
Ted Hopp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.