Java FileOutputStream Створити файл, якщо його немає


187

Чи є спосіб використовувати FileOutputStream таким чином, що якщо файл (ім'я файлу String) не існує, він створить його?

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

Відповіді:


302

Він буде кидати a, 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 файл?
Стефан Данн

3
@StefanDunn з createNewFile()методом, як показано в моєму прикладі.
тальніколі

55
Стан зайвий. За словами JavaDoc , createNewFile()сам атомно перевіряє існування файлу.
aztek

8
@aztek, ймовірно, ми могли б залишити умову для покращення читабельності коду
Андрій Черненко

2
createNewFile()тут загальна витрата часу. Система вже це зробить. Ти просто змушуєш його двічі подивитися.
Маркіз Лорн

61

Перш ніж створити файл, потрібно створити всі батьківські каталоги.

Використовуйте yourFile.getParentFile().mkdirs()


23

Ви можете створити порожній файл, існує він чи ні ...

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

якщо ви хочете залишити файл, якщо він існує ...

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

FileNotFoundException ви отримаєте лише в тому випадку, якщо спробуєте створити файл у каталозі, який не існує.


3
Це кидає FileNotFoundExceptionв обох випадках.
міксель

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

Передайте це fсвоєму FileOutputStreamконструктору.


2
Тут є умова гонки ... Краще це зробити так: Файл f = new File ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("Файл вже існує"); }
людяність

19

FileUtils від apache commons - це досить хороший спосіб досягти цього за один рядок.

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:

Параметр параметрів визначає, як файл створюється або відкривається ... він відкриває файл для запису, створюючи файл, якщо його не існує ...

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


0

new FileOutputStream(f) створить файл у більшості випадків, але, на жаль, ви отримаєте FileNotFoundException

якщо файл існує, але це каталог, а не звичайний файл, він не існує, але не може бути створений або не може бути відкритий з будь-якої іншої причини

від Javadoc

Іншим словом, може виникнути безліч випадків, коли ви отримаєте FileNotFoundException, що означає "Не вдалося створити свій файл", але ви не зможете знайти причину, чому не вдалося створити файл.

Рішення полягає в тому, щоб видалити будь-який виклик до API файлів і використовувати замість нього файли API, оскільки це забезпечує набагато кращу обробку помилок. Як правило , замінити будь-якого new FileOutputStream(f)зFiles.newOutputStream(p) .

У випадках, коли вам потрібно використовувати API файлу (оскільки, наприклад, ви використовуєте зовнішній інтерфейс, використовуючи "Файл"), це використання Files.createFile(p)- це хороший спосіб переконатися, що ваш файл створений належним чином, і якщо ні, ви не знаєте, чому він не працює. Деякі люди коментували вище, що це зайве. Це правда, але ви отримуєте краще поводження з помилками, яке може знадобитися в деяких випадках.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.