สร้างเส้นทางทั้งหมดโดยอัตโนมัติเมื่อเขียนไปยังไฟล์ใหม่


246

FileWriterผมอยากจะเขียนไฟล์ใหม่ด้วย ฉันใช้มันแบบนี้:

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

ตอนนี้dir1และdir2ในปัจจุบันไม่มีอยู่ ฉันต้องการให้ Java สร้างมันขึ้นมาโดยอัตโนมัติหากยังไม่มี จริงๆแล้ว Java ควรตั้งค่าพา ธ ไฟล์ทั้งหมดหากยังไม่มีอยู่

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

คำตอบ:


431

สิ่งที่ต้องการ:

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

11
ทำไม getParentFile และไม่ใช่แค่ mkdirs?
sauperl

มันจะแทนที่โฟลเดอร์ก่อนหน้าหรือไม่หากฉันพิมพ์รหัสเดียวกันใหม่ด้วยไฟล์ sibling ที่ต่างออกไป
surajs1n

1
@ surajs1n: หากมีไดเรกทอรีอยู่แล้วmkdirsจะไม่ทำอะไรเลย
Jon Skeet

3
@sauperl: หากไฟล์ยังไม่มีอยู่mkdirs ()จะถือว่าทุกสิ่งที่ระบุเป็นไดเรกทอรีและสร้างมันขึ้นมา (เพิ่งทดสอบ) โดยใช้getParentFile () , คุณออกจากการสร้างไฟล์ตัวเองไปยังFileWriter
h4nek

149

ตั้งแต่ Java 1.7 คุณสามารถใช้ Files.createFile:

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

4
สิ่งสำคัญที่ควรทราบว่าพา ธ สัมพัทธ์อาจทำให้เกิดข้อยกเว้นตัวชี้โมฆะ Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Mag

if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // ทดสอบว่ามี dir อยู่แล้วเพื่อหลีกเลี่ยงข้อผิดพลาด
Andre Nel



4

ใช้FileUtilsเพื่อจัดการกับอาการปวดหัวเหล่านี้

แก้ไข: ตัวอย่างเช่นใช้รหัสด้านล่างเพื่อเขียนไฟล์วิธีนี้จะ 'ตรวจสอบและสร้างไดเรกทอรีหลักหากไม่มีอยู่'

openOutputStream(File file [, boolean append]) 

1
ได้โปรดคุณเจาะจงมากขึ้นไหม
Jean

สวัสดีฌอง, แก้ไข มีวิธีการที่มีประโยชน์อื่น ๆ มากมายภายใต้ FileUtils Apache Commons IO classes เช่น OIUtils และ FileUtils ทำให้ชีวิตของผู้พัฒนาจาวาง่ายขึ้น
kakacii

1
ฉันเห็นด้วย FileUtils เป็นวิธีที่ดี แต่ฉันคิดว่าวิธีที่ง่ายกว่าคือการใช้ writeStringToFile ไม่ใช่ openOutputStream เช่นไฟล์ไฟล์ = ไฟล์ใหม่ ("C: /user/Desktop/dir1/dir2/filename.txt"); FileUtils.writeStringToFile (ไฟล์ "foo bar baz", จริง);
พอล

ขอบคุณสำหรับสิ่งนั้น ทำให้โค้ดของฉันสะอาดขึ้นมากในตอนนี้ ลิงก์ไปยัง javadoc ล่าสุด: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
Nikhil Sahu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.