Java FileOutputStream Créer un fichier s'il n'existe pas

187

Existe-t-il un moyen d'utiliser FileOutputStream de manière à ce que si un fichier (String filename) n'existe pas, il le créera?

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

Réponses:

302

Il lancera un FileNotFoundExceptionsi le fichier n'existe pas et ne peut pas être créé ( doc ), mais il le créera s'il le peut. Pour être sûr, vous devriez probablement d'abord tester que le fichier existe avant de créer le FileOutputStream(et créer avec createNewFile()si ce n'est pas le cas):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 
talnicolas
la source
2
si le fichier n'existe pas, comment créer un fichier .txt vide?
Stefan Dunn
3
@StefanDunn avec la createNewFile()méthode, comme indiqué dans mon exemple.
talnicolas
55
La condition est redondante. Selon JavaDoc , createNewFile()lui - même vérifie de manière atomique l'existence du fichier.
aztek
8
@aztek nous pourrions probablement quitter la condition pour améliorer la lisibilité du code
Andrii Chernenko
2
createNewFile()est une perte de temps totale ici. Le système le fera déjà. Vous le forcez juste à regarder deux fois.
Marquis of Lorne
61

Avant de créer un fichier, il est nécessaire de créer tous les répertoires parents.

Utilisation yourFile.getParentFile().mkdirs()

Kostiantyn Medvid
la source
23

Vous pouvez créer un fichier vide qu'il existe ou non ...

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

si vous souhaitez quitter le fichier s'il existe ...

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

Vous n'obtiendrez une FileNotFoundException que si vous essayez de créer le fichier dans un répertoire qui n'existe pas.

Peter Lawrey
la source
3
Il jette FileNotFoundExceptiondans les deux cas.
mixel
21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Transmettez ceci fà votre FileOutputStreamconstructeur.

Shashank Kadne
la source
2
Il y a une condition de concurrence ici ... Mieux vaut le faire comme suit: Fichier f = nouveau fichier ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("Le fichier existe déjà"); }
humanité
19

FileUtils d'apache commons est un très bon moyen d'y parvenir en une seule ligne.

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

Cela créera des dossiers parents s'ils n'existent pas et un fichier s'il n'existe pas et lèvera une exception si l'objet fichier est un répertoire ou ne peut pas être écrit. Cela équivaut à :

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

Toutes les opérations ci-dessus lèveront une exception si l'utilisateur actuel n'est pas autorisé à effectuer l'opération.

Nikhil Sahu
la source
4

Créez un fichier s'il n'existe pas. Si le fichier se ferme, effacez son contenu:

/**
 * 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();
    }
}
Do Nhu Vy
la source
2

Donner simplement un moyen alternatif de créer le fichier uniquement s'il n'existe pas en utilisant Path and Files.

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
la source
0

Vous pouvez potentiellement obtenir un FileNotFoundExceptionsi le fichier n'existe pas.

La documentation Java dit:

La disponibilité ou la création d'un fichier dépend de la plate-forme sous-jacente http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

Si vous utilisez Java 7, vous pouvez utiliser le package java.nio:

Le paramètre options spécifie comment le fichier est créé ou ouvert ... il ouvre le fichier pour l'écriture, créant le fichier s'il n'existe pas ...

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

sikander
la source
0

new FileOutputStream(f) créera un fichier dans la plupart des cas, mais malheureusement, vous obtiendrez une FileNotFoundException

si le fichier existe mais est un répertoire plutôt qu'un fichier normal, n'existe pas mais ne peut pas être créé ou ne peut être ouvert pour une autre raison

depuis Javadoc

En d'autres termes, il pourrait y avoir de nombreux cas où vous obtiendrez FileNotFoundException signifiant "Impossible de créer votre fichier", mais vous ne pourriez pas trouver la raison pour laquelle la création du fichier a échoué.

Une solution consiste à supprimer tout appel à l'API File et à utiliser l'API Files à la place, car elle offre une bien meilleure gestion des erreurs. En général, remplacez-les new FileOutputStream(f)par Files.newOutputStream(p).

Dans les cas où vous devez utiliser l'API File (parce que vous utilisez une interface externe utilisant File par exemple), l'utilisation Files.createFile(p)est un bon moyen de vous assurer que votre fichier est créé correctement et sinon, vous saurez pourquoi cela n'a pas fonctionné. Certaines personnes ont commenté ci-dessus que c'est redondant. C'est vrai, mais vous obtenez une meilleure gestion des erreurs qui peut être nécessaire dans certains cas.

pile débordée
la source