Làm thế nào để tạo một tệp mới cùng với các thư mục mẹ bị thiếu?


98

Khi đang sử dụng

file.createNewFile();

Tôi nhận được ngoại lệ sau

java.io.IOException: Parent directory of file does not exist: /.../pkg/databases/mydb

Tôi tự hỏi liệu có createNewFile tạo các thư mục mẹ bị thiếu không?

Câu trả lời:


150

Bạn đã thử cái này chưa?

file.getParentFile().mkdirs();
file.createNewFile();

Tôi không biết về một lệnh gọi phương thức duy nhất sẽ thực hiện điều này, nhưng nó khá dễ dàng với hai câu lệnh.


Điều này chỉ hoạt động nếu file được tạo ra với một chuỗi đường dẫn, trong đó có một thư mục cha, tức là new File("file.txt").getParentFile()lợi nhuận null, new File("dir/file.txt").getParentFile()trả về giống nhưnew File("dir")
Zoltán

1
Đúng vậy, bạn không cần mkdirsnếu tệp bạn đang cố gắng tạo không nằm trong thư mục không tồn tại, nhưng trường hợp sử dụng của tôi là tôi đang tạo nhiều tệp, một số tệp có thư mục mẹ, trong khi những tệp khác thì không.
Zoltán

14

Câu trả lời của Jon hoạt động nếu bạn chắc chắn rằng chuỗi đường dẫn mà bạn đang tạo tệp bao gồm các thư mục mẹ, tức là nếu bạn chắc chắn rằng đường dẫn có dạng <parent-dir>/<file-name>.

Nếu nó không, tức là nó là một đường dẫn tương đối của biểu mẫu <file-name>, sau đó getParentFile()sẽ trả về null.

Ví dụ

File f = new File("dir/text.txt");
f.getParentFile().mkdirs();     // works fine because the path includes a parent directory.

File f = new File("text.txt");
f.getParentFile().mkdirs();     // throws NullPointerException because the parent file is unknown, i.e. `null`.

Vì vậy, nếu đường dẫn tệp của bạn có thể có hoặc không bao gồm các thư mục mẹ, bạn sẽ an toàn hơn với mã sau:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();

vì nhiều lý do, bạn nên luôn bao gồm một đường dẫn. Làm cách nào khác để hệ thống biết bạn muốn đặt tệp đó ở đâu?
NikkyD

@NikkyD Tôi xin lỗi, tôi không hiểu lắm nhận xét của bạn. Trong câu trả lời của tôi, tôi không nói rằng bạn không bao gồm một đường dẫn, nhưng đường dẫn được truyền qua có thể không bao gồm các thư mục mẹ . Cũng có một ví dụ cho một đường dẫn như vậy trong câu trả lời.
Zoltán

7

Kể từ java7, bạn cũng có thể sử dụng NIO2 API:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
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.