Tạo toàn bộ đường dẫn tự động khi ghi vào một tệp mới


246

Tôi muốn viết một tập tin mới với FileWriter. Tôi sử dụng nó như thế này:

FileWriter newJsp = new FileWriter("C:\\user\Desktop\dir1\dir2\filename.txt");

Bây giờ dir1dir2hiện tại không tồn tại. Tôi muốn Java tự động tạo chúng nếu chúng chưa có ở đó. Trên thực tế Java nên thiết lập toàn bộ đường dẫn tệp nếu chưa có.

Làm thế nào tôi có thể đạt được điều này?

Câu trả lời:


431

Cái gì đó như:

File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file);

11
Tại sao getParentFile và không chỉ mkdirs?
sauperl

Nó sẽ ghi đè lên thư mục trước đó, nếu tôi đang phát hành lại cùng một mã với các tệp anh chị em khác nhau?
surajs1n

1
@ surajs1n: Nếu thư mục đã tồn tại, mkdirssẽ không làm gì cả.
Jon Skeet

3
@sauperl: Nếu tệp chưa tồn tại, mkdirs () sẽ cho rằng mọi thứ được chỉ định là một thư mục và tạo tệp như vậy (chỉ cần kiểm tra nó). Bằng cách sử dụng getParentFile () , bạn để lại việc tạo tệp cho FileWriter .
h4nek

149

Vì Java 1.7, bạn có thể sử dụng Files.createFile:

Path pathToFile = Paths.get("/home/joe/foo/bar/myFile.txt");
Files.createDirectories(pathToFile.getParent());
Files.createFile(pathToFile);

4
Điều quan trọng cần lưu ý rằng các đường dẫn tương đối có thể gây ra ngoại lệ con trỏ null. Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Mag

if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // Kiểm tra xem thư mục đã tồn tại để tránh lỗi chưa
Andre Nel

29

Sử dụng File.mkdirs():

File dir = new File("C:\\user\\Desktop\\dir1\\dir2");
dir.mkdirs();
File file = new File(dir, "filename.txt");
FileWriter newJsp = new FileWriter(file);


4

Sử dụng FileUtils để xử lý tất cả những vấn đề đau đầu này.

Chỉnh sửa: Ví dụ: sử dụng mã bên dưới để ghi vào tệp, phương thức này sẽ 'kiểm tra và tạo thư mục mẹ nếu nó không tồn tại'.

openOutputStream(File file [, boolean append]) 

1
Xin vui lòng, bạn có thể được cụ thể hơn?
Jean

Xin chào Jean, Đã chỉnh sửa. Có một loạt các phương thức hữu ích khác trong FileUtils. Các lớp IO của Apache Commons như OIUtils và FileUtils giúp cuộc sống của các nhà phát triển java dễ dàng hơn.
kakacii

1
Tôi đồng ý FileUtils là một cách tốt để đi, nhưng tôi nghĩ một cách dễ dàng hơn cho việc này là sử dụng writeStringToFile, không phải openOutputStream. Ví dụ: Tệp tệp = Tệp mới ("C: /user/Desktop/dir1/dir2/filename.txt"); FileUtils.writeStringToFile (tệp, "foo bar baz", đúng);
paul

Cảm ơn vì điều đó . Làm cho mã của tôi sạch hơn nhiều bây giờ. Liên kết với javadoc gần đây: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/ Kẻ
Nikhil Sahu
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.