Java FileOutputStream Tạo tệp nếu không tồn tại


187

Có cách nào để sử dụng FileOutputStream theo cách mà nếu một tệp (Tên tệp chuỗi) không tồn tại, thì nó sẽ tạo ra nó?

FileOutputStream oFile = new FileOutputStream("score.txt", false);

Câu trả lời:


302

Nó sẽ ném FileNotFoundExceptionnếu tập tin không tồn tại và không thể được tạo ( doc ), nhưng nó sẽ tạo nó nếu có thể. Để chắc chắn, trước tiên bạn có thể nên kiểm tra xem tệp có tồn tại trước khi bạn tạo FileOutputStream(và tạo với createNewFile()nếu không):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 

2
nếu tệp không tồn tại, làm cách nào để tạo tệp .txt trống?
Stefan Dunn

3
@StefanDunn với createNewFile()phương thức, như trong ví dụ của tôi.
Talnicolas

55
Điều kiện là dư thừa. Theo JavaDoc , createNewFile()chính nó kiểm tra sự tồn tại của tệp.
aztek

8
@aztek có lẽ chúng ta có thể rời khỏi điều kiện để cải thiện khả năng đọc mã
Andrii Chernenko

2
createNewFile()là một sự lãng phí hoàn toàn thời gian ở đây. Hệ thống sẽ làm điều đó. Bạn chỉ đang buộc nó phải nhìn hai lần.
Hầu tước Lorne

61

Trước khi tạo một tệp, cần phải tạo tất cả các thư mục của cha mẹ.

Sử dụng yourFile.getParentFile().mkdirs()


23

Bạn có thể tạo một tệp trống cho dù nó tồn tại hay không ...

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

nếu bạn muốn để lại tập tin nếu nó tồn tại ...

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

Bạn sẽ chỉ nhận được FileNotFoundException nếu bạn cố gắng tạo tệp trong thư mục không tồn tại.


3
Nó ném FileNotFoundExceptiontrong cả hai trường hợp.
mixel

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

Truyền cái này fcho FileOutputStreamconstructor của bạn


2
Có một điều kiện cuộc đua ở đây ... Tốt hơn để làm điều đó như sau: Tệp f = Tệp mới ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("Tệp đã tồn tại"); }
nhân loại

19

FileUtils từ apache commons là một cách khá tốt để đạt được điều này trong một dòng duy nhất.

FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))

Điều này sẽ tạo các thư mục mẹ nếu không tồn tại và tạo một tệp nếu không tồn tại và ném ngoại lệ nếu đối tượng tệp là một thư mục hoặc không thể được ghi vào. Điều này tương đương với :

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

Tất cả các hoạt động trên sẽ đưa ra một ngoại lệ nếu người dùng hiện tại không được phép thực hiện thao tác.


4

Tạo tập tin nếu không tồn tại. Nếu thoát tệp, xóa nội dung của nó:

/**
 * 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

Chỉ đưa ra một cách khác để tạo tệp chỉ khi không tồn tại bằng Đường dẫn và Tệp.

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());

0

Bạn có khả năng có thể nhận được FileNotFoundExceptionnếu tập tin không tồn tại.

Tài liệu Java nói:

Một tập tin có sẵn hay không hoặc có thể được tạo hay không phụ thuộc vào nền tảng cơ bản http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

Nếu bạn đang sử dụng Java 7, bạn có thể sử dụng gói java.nio:

Tham số tùy chọn chỉ định cách tệp được tạo hoặc mở ... nó sẽ mở tệp để ghi, tạo tệp nếu nó không tồn tại ...

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html


0

new FileOutputStream(f) sẽ tạo một tệp trong hầu hết các trường hợp, nhưng thật không may, bạn sẽ nhận được FileNotFoundException

nếu tệp tồn tại nhưng là một thư mục chứ không phải là tệp thông thường, không tồn tại nhưng không thể được tạo hoặc không thể mở vì bất kỳ lý do nào khác

từ Javadoc

Tôi có một từ khác có thể có nhiều trường hợp bạn sẽ nhận được FileNotFoundException có nghĩa là "Không thể tạo tệp của bạn", nhưng bạn sẽ không thể tìm thấy lý do tại sao việc tạo tệp thất bại.

Một giải pháp là loại bỏ bất kỳ cuộc gọi nào đến API tệp và sử dụng API tệp thay vì nó cung cấp xử lý lỗi tốt hơn nhiều. Thường thay thế bất kỳ new FileOutputStream(f)bằng Files.newOutputStream(p).

Trong trường hợp bạn cần sử dụng API tệp (vì bạn sử dụng giao diện bên ngoài bằng Tệp chẳng hạn), sử dụng Files.createFile(p)là một cách tốt để đảm bảo tệp của bạn được tạo đúng và nếu không bạn sẽ biết tại sao nó không hoạt động. Một số người nhận xét ở trên rằng điều này là dư thừa. Đó là sự thật, nhưng bạn có thể xử lý lỗi tốt hơn có thể cần thiết trong một số trường hợp.

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.