Java FileOutputStream สร้างไฟล์หากไม่มีอยู่


คำตอบ:


302

มันจะโยน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); 

2
หากไฟล์ไม่มีอยู่ฉันจะสร้างไฟล์. txt ว่างได้อย่างไร
Stefan Dunn

3
@StefanDunn ด้วยcreateNewFile()วิธีการตามที่แสดงในตัวอย่างของฉัน
talnicolas

55
เงื่อนไขซ้ำซ้อน ตามJavaDoc , createNewFile()ตัวเองอะตอมตรวจสอบการดำรงอยู่ของไฟล์
aztek

8
@aztek บางทีเราอาจปล่อยให้เงื่อนไขในการปรับปรุงการอ่านรหัส
Andrii Chernenko

2
createNewFile()เป็นการเสียเวลาทั้งหมดที่นี่ ระบบจะทำเช่นนั้นแล้ว คุณแค่บังคับให้มองสองครั้ง
มาร์ควิสแห่ง Lorne

61

ก่อนที่จะสร้างไฟล์จำเป็นต้องสร้างไดเร็กทอรีทั้งหมดของพาเรนต์

ใช้ yourFile.getParentFile().mkdirs()


23

คุณสามารถสร้างไฟล์เปล่าได้ว่ามีอยู่หรือไม่ ...

new FileOutputStream("score.txt", false).close();

หากคุณต้องการออกจากไฟล์หากมีอยู่ ...

new FileOutputStream("score.txt", true).close();

คุณจะได้รับ FileNotFoundException เท่านั้นหากคุณพยายามสร้างไฟล์ในไดเรกทอรีที่ไม่มีอยู่


3
มันพ่นFileNotFoundExceptionในทั้งสองกรณี
mixel

21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

ส่งสิ่งนี้fให้กับผู้FileOutputStreamสร้างของคุณ


2
มีสภาพการแข่งขันที่นี่ ... ดีกว่าที่จะทำดังนี้: ไฟล์ f = ไฟล์ใหม่ ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("ไฟล์มีอยู่แล้ว"); }
มนุษยชาติ

19

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);

การดำเนินการทั้งหมดข้างต้นจะมีข้อยกเว้นหากผู้ใช้ปัจจุบันไม่ได้รับอนุญาตให้ดำเนินการ


4

สร้างไฟล์หากไม่มีอยู่ หากไฟล์ออกให้ล้างเนื้อหาของไฟล์:

/**
 * 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();
    }
}

2

เพียงให้วิธีอื่นในการสร้างไฟล์เฉพาะในกรณีที่ไม่มีอยู่ใน 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());

0

คุณอาจได้รับ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


0

new FileOutputStream(f) จะสร้างไฟล์ในกรณีส่วนใหญ่ แต่น่าเสียดายที่คุณจะได้รับ FileNotFoundException

หากไฟล์มีอยู่ แต่เป็นไดเรกทอรีแทนที่จะเป็นไฟล์ปกติจะไม่มีอยู่ แต่ไม่สามารถสร้างได้หรือไม่สามารถเปิดได้ด้วยเหตุผลอื่นใด

จาก Javadoc

ฉันอาจมีอีกหลายกรณีที่คุณจะได้รับ FileNotFoundException ความหมาย "ไม่สามารถสร้างไฟล์ของคุณ" แต่คุณจะไม่สามารถหาสาเหตุของสาเหตุที่การสร้างไฟล์ล้มเหลว

วิธีแก้ไขคือลบการเรียกไปยัง File API และใช้ Files API แทนเนื่องจากเป็นการจัดการข้อผิดพลาดที่ดีกว่ามาก โดยปกติแล้วแทนที่ด้วยnew FileOutputStream(f)Files.newOutputStream(p)

ในกรณีที่คุณจำเป็นต้องใช้ File API (เนื่องจากคุณใช้อินเทอร์เฟซภายนอกโดยใช้ไฟล์เป็นต้น) การใช้Files.createFile(p)เป็นวิธีที่ดีในการตรวจสอบให้แน่ใจว่าไฟล์ของคุณสร้างขึ้นอย่างถูกต้องและหากคุณไม่ทราบว่าทำไมมันจึงไม่ทำงาน บางคนแสดงความคิดเห็นข้างต้นว่านี่ซ้ำซ้อน มันเป็นความจริง แต่คุณจะได้รับข้อผิดพลาดที่ดีกว่าซึ่งอาจจำเป็นในบางกรณี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.