Java FileOutputStream Buat File jika tidak ada

187

Apakah ada cara untuk menggunakan FileOutputStream sedemikian rupa sehingga jika file (String nama file) tidak ada, maka itu akan membuatnya?

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

Jawaban:

302

Ini akan melempar FileNotFoundExceptionjika file tidak ada dan tidak dapat dibuat ( doc ), tetapi itu akan membuatnya jika bisa. Untuk memastikan Anda mungkin harus terlebih dahulu menguji apakah file tersebut ada sebelum Anda membuat FileOutputStream(dan membuat dengan createNewFile()jika tidak):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 
talnicolas
sumber
2
jika file tidak ada, bagaimana cara membuat file .txt kosong?
Stefan Dunn
3
@StefanDunn dengan createNewFile()metode, seperti yang ditunjukkan pada contoh saya.
talnicolas
55
Kondisinya berlebihan. Menurut JavaDoc , createNewFile()sendiri secara atomis memeriksa keberadaan file.
aztek
8
@aztek mungkin kita bisa meninggalkan kondisi untuk meningkatkan keterbacaan kode
Andrii Chernenko
2
createNewFile()adalah total buang waktu di sini. Sistem sudah akan melakukan itu. Anda hanya memaksanya terlihat dua kali.
Marquis of Lorne
61

Sebelum membuat file, diperlukan untuk membuat semua direktori induk.

Menggunakan yourFile.getParentFile().mkdirs()

Kostiantyn Medvid
sumber
23

Anda dapat membuat file kosong apakah itu ada atau tidak ...

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

jika Anda ingin meninggalkan file jika ada ...

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

Anda hanya akan mendapatkan FileNotFoundException jika Anda mencoba membuat file di direktori yang tidak ada.

Peter Lawrey
sumber
3
Itu melempar FileNotFoundExceptiondalam kedua kasus.
mixel
21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Berikan ini fkepada FileOutputStreamkonstruktor Anda .

Shashank Kadne
sumber
2
Ada kondisi lomba di sini ... Lebih baik melakukannya sebagai berikut: File f = File baru ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("File sudah ada"); }
kemanusiaan
19

FileUtils dari apache commons adalah cara yang cukup baik untuk mencapai ini dalam satu baris.

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

Ini akan membuat folder induk jika tidak ada dan membuat file jika tidak ada dan melemparkan pengecualian jika objek file adalah direktori atau tidak dapat ditulis ke. Ini setara dengan :

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

Semua operasi di atas akan mengeluarkan pengecualian jika pengguna saat ini tidak diizinkan untuk melakukan operasi.

Nikhil Sahu
sumber
4

Buat file jika tidak ada. Jika file keluar, hapus kontennya:

/**
 * 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();
    }
}
Apakah Nhu Vy
sumber
2

Hanya Memberikan cara alternatif untuk membuat file hanya jika tidak ada menggunakan Path dan File.

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

Anda berpotensi mendapatkan FileNotFoundExceptionjika file tersebut tidak ada.

Dokumentasi Java mengatakan:

Apakah file tersedia atau tidak dapat dibuat tergantung pada platform yang mendasarinya http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

Jika Anda menggunakan Java 7 Anda dapat menggunakan paket java.nio:

Parameter opsi menentukan bagaimana file dibuat atau dibuka ... membuka file untuk ditulis, membuat file jika tidak ada ...

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

sikander
sumber
0

new FileOutputStream(f) akan membuat file dalam banyak kasus, tetapi sayangnya Anda akan mendapatkan FileNotFoundException

jika file ada tetapi merupakan direktori dan bukan file biasa, tidak ada tetapi tidak dapat dibuat, atau tidak dapat dibuka karena alasan lain

dari Javadoc

Saya kata lain mungkin ada banyak kasus di mana Anda akan mendapatkan FileNotFoundException yang berarti "Tidak dapat membuat file Anda", tetapi Anda tidak akan dapat menemukan alasan mengapa pembuatan file gagal.

Solusi adalah menghapus panggilan apa pun ke API File dan menggunakan API File sebagai gantinya karena memberikan penanganan kesalahan yang jauh lebih baik. Biasanya ganti new FileOutputStream(f)dengan Files.newOutputStream(p).

Dalam kasus di mana Anda perlu menggunakan File API (karena Anda menggunakan antarmuka eksternal menggunakan File misalnya), menggunakan Files.createFile(p)adalah cara yang baik untuk memastikan file Anda dibuat dengan benar dan jika tidak, Anda akan tahu mengapa itu tidak berfungsi. Beberapa orang berkomentar di atas bahwa ini berlebihan. Memang benar, tetapi Anda mendapatkan penanganan kesalahan yang lebih baik yang mungkin diperlukan dalam beberapa kasus.

stackoverflow
sumber