Buat seluruh jalur secara otomatis saat menulis ke file baru

246

Saya ingin menulis file baru dengan FileWriter. Saya menggunakannya seperti ini:

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

Sekarang dir1dan dir2saat ini tidak ada. Saya ingin Java membuatnya secara otomatis jika belum ada di sana. Sebenarnya Java harus mengatur seluruh path file jika belum ada.

Bagaimana saya bisa mencapai ini?


sumber

Jawaban:

431

Sesuatu seperti:

File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file);
Jon Skeet
sumber
11
Mengapa getParentFile dan bukan hanya mkdir?
sauperl
Apakah ini akan menggantikan folder sebelumnya, jika saya mengeluarkan kembali kode yang sama dengan file saudara berbeda?
surajs1n
1
@ surajs1n: Jika direktori sudah ada, mkdirstidak akan melakukan apa-apa.
Jon Skeet
3
@sauperl: Jika file tersebut belum ada, mkdirs () akan menganggap semua yang ditentukan adalah direktori dan membuatnya seperti itu (baru mengujinya). Dengan menggunakan getParentFile () , Anda meninggalkan pembuatan file itu sendiri ke FileWriter .
h4nek
149

Sejak Java 1.7 Anda dapat menggunakan Files.createFile:

Path pathToFile = Paths.get("/home/joe/foo/bar/myFile.txt");
Files.createDirectories(pathToFile.getParent());
Files.createFile(pathToFile);
cdmihai
sumber
4
Penting untuk diingat bahwa jalur relatif dapat menyebabkan pengecualian pointer nol. Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Mag
if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // Uji apakah dir sudah ada untuk menghindari kesalahan
Andre Nel
29

Gunakan 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);
Armand
sumber
16

Gunakan File.mkdirs().

Marcelo Cantos
sumber
1
Itu akan membuat direktori `C: \\ user \ Desktop \ dir1 \ dir2 \ filename.txt`.
Martin Schröder
@ MartinSchröder: Hanya jika Anda menyimpan komponen nama file.
Marcelo Cantos
4

Gunakan FileUtils untuk menangani semua sakit kepala ini.

Sunting: Misalnya, gunakan kode di bawah ini untuk menulis ke file, metode ini akan 'memeriksa dan membuat direktori induk jika tidak ada'.

openOutputStream(File file [, boolean append]) 
kakacii
sumber
1
Tolong, bisakah Anda lebih spesifik?
Jean
Hai Jean, Diedit. Ada sejumlah metode lain yang berguna di bawah FileUtils. Kelas-kelas IO Apache Commons seperti OIUtils dan FileUtils membuat hidup para pengembang java lebih mudah.
kakacii
1
Saya setuju FileUtils adalah cara yang baik untuk pergi, tetapi saya pikir cara yang lebih mudah untuk ini adalah menggunakan writeStringToFile, bukan openOutputStream. Misalnya file File = File baru ("C: /user/Desktop/dir1/dir2/filename.txt"); FileUtils.writeStringToFile (file, "foo bar baz", true);
paul
Terima kasih untuk itu . Membuat kode saya jauh lebih bersih sekarang. Tautan ke javadoc baru-baru ini: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
Nikhil Sahu