มีวิธีใช้ FileOutputStream ในลักษณะที่ว่าถ้าไฟล์ (ชื่อไฟล์ String) ไม่มีอยู่แล้วมันจะสร้างมันขึ้นมา?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
มีวิธีใช้ FileOutputStream ในลักษณะที่ว่าถ้าไฟล์ (ชื่อไฟล์ String) ไม่มีอยู่แล้วมันจะสร้างมันขึ้นมา?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
คำตอบ:
มันจะโยนFileNotFoundException
ถ้าไฟล์ไม่อยู่และไม่สามารถสร้าง ( doc ) แต่มันจะสร้างมันถ้ามันสามารถ เพื่อให้แน่ใจว่าคุณควรทดสอบก่อนว่าไฟล์นั้นมีอยู่ก่อนที่คุณจะสร้างFileOutputStream
(และสร้างด้วยcreateNewFile()
หากไม่มี):
File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing
FileOutputStream oFile = new FileOutputStream(yourFile, false);
createNewFile()
วิธีการตามที่แสดงในตัวอย่างของฉัน
createNewFile()
เป็นการเสียเวลาทั้งหมดที่นี่ ระบบจะทำเช่นนั้นแล้ว คุณแค่บังคับให้มองสองครั้ง
ก่อนที่จะสร้างไฟล์จำเป็นต้องสร้างไดเร็กทอรีทั้งหมดของพาเรนต์
ใช้ yourFile.getParentFile().mkdirs()
คุณสามารถสร้างไฟล์เปล่าได้ว่ามีอยู่หรือไม่ ...
new FileOutputStream("score.txt", false).close();
หากคุณต้องการออกจากไฟล์หากมีอยู่ ...
new FileOutputStream("score.txt", true).close();
คุณจะได้รับ FileNotFoundException เท่านั้นหากคุณพยายามสร้างไฟล์ในไดเรกทอรีที่ไม่มีอยู่
FileNotFoundException
ในทั้งสองกรณี
File f = new File("Test.txt");
if(!f.exists()){
f.createNewFile();
}else{
System.out.println("File already exists");
}
ส่งสิ่งนี้f
ให้กับผู้FileOutputStream
สร้างของคุณ
FileUtilsจาก apache คอมมอนส์เป็นวิธีที่ดีในการบรรลุผลในบรรทัดเดียว
FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))
สิ่งนี้จะสร้างโฟลเดอร์พาเรนต์หากไม่มีอยู่และสร้างไฟล์หากไม่มีอยู่และมีข้อยกเว้นหากวัตถุไฟล์เป็นไดเรกทอรีหรือไม่สามารถเขียนได้ นี่เทียบเท่ากับ :
File file = new File("/home/nikhil/somedir/file.txt");
file.getParentFile().mkdirs(); // Will create parent directories if not exists
file.createNewFile();
FileOutputStream s = new FileOutputStream(file,false);
การดำเนินการทั้งหมดข้างต้นจะมีข้อยกเว้นหากผู้ใช้ปัจจุบันไม่ได้รับอนุญาตให้ดำเนินการ
สร้างไฟล์หากไม่มีอยู่ หากไฟล์ออกให้ล้างเนื้อหาของไฟล์:
/**
* Create file if not exist.
*
* @param path For example: "D:\foo.xml"
*/
public static void createFile(String path) {
try {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
} else {
FileOutputStream writer = new FileOutputStream(path);
writer.write(("").getBytes());
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
เพียงให้วิธีอื่นในการสร้างไฟล์เฉพาะในกรณีที่ไม่มีอยู่ใน Path และ Files
Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
Files.createFile(path);
Files.write(path, ("").getBytes());
คุณอาจได้รับFileNotFoundException
ถ้าไม่มีไฟล์อยู่
เอกสาร Java พูดว่า:
ไม่ว่าไฟล์จะพร้อมใช้งานหรืออาจจะสร้างขึ้นอยู่กับแพลตฟอร์มพื้นฐาน http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html
หากคุณใช้ Java 7 คุณสามารถใช้แพ็คเกจ java.nio:
พารามิเตอร์ options ระบุวิธีการสร้างหรือเปิดไฟล์ ... มันจะเปิดไฟล์สำหรับการเขียนโดยการสร้างไฟล์หากไม่มีอยู่ ...
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
new FileOutputStream(f)
จะสร้างไฟล์ในกรณีส่วนใหญ่ แต่น่าเสียดายที่คุณจะได้รับ FileNotFoundException
หากไฟล์มีอยู่ แต่เป็นไดเรกทอรีแทนที่จะเป็นไฟล์ปกติจะไม่มีอยู่ แต่ไม่สามารถสร้างได้หรือไม่สามารถเปิดได้ด้วยเหตุผลอื่นใด
ฉันอาจมีอีกหลายกรณีที่คุณจะได้รับ FileNotFoundException ความหมาย "ไม่สามารถสร้างไฟล์ของคุณ" แต่คุณจะไม่สามารถหาสาเหตุของสาเหตุที่การสร้างไฟล์ล้มเหลว
วิธีแก้ไขคือลบการเรียกไปยัง File API และใช้ Files API แทนเนื่องจากเป็นการจัดการข้อผิดพลาดที่ดีกว่ามาก โดยปกติแล้วแทนที่ด้วยnew FileOutputStream(f)
Files.newOutputStream(p)
ในกรณีที่คุณจำเป็นต้องใช้ File API (เนื่องจากคุณใช้อินเทอร์เฟซภายนอกโดยใช้ไฟล์เป็นต้น) การใช้Files.createFile(p)
เป็นวิธีที่ดีในการตรวจสอบให้แน่ใจว่าไฟล์ของคุณสร้างขึ้นอย่างถูกต้องและหากคุณไม่ทราบว่าทำไมมันจึงไม่ทำงาน บางคนแสดงความคิดเห็นข้างต้นว่านี่ซ้ำซ้อน มันเป็นความจริง แต่คุณจะได้รับข้อผิดพลาดที่ดีกว่าซึ่งอาจจำเป็นในบางกรณี