Java FileOutputStream Crea file se non esiste


187

C'è un modo per utilizzare FileOutputStream in modo tale che se un file (String filename) non esiste, lo creerà?

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

Risposte:


302

Lancerà a FileNotFoundExceptionse il file non esiste e non può essere creato ( doc ), ma lo creerà se possibile. Per essere sicuri, probabilmente dovresti prima verificare che il file esista prima di creare il FileOutputStream(e creare con createNewFile()se non lo fa):

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

2
se il file non esiste, come dovrei creare un file .txt vuoto?
Stefan Dunn,

3
@StefanDunn con il createNewFile()metodo, come mostrato nel mio esempio.
talnicolas,

55
La condizione è ridondante. Secondo JavaDoc , esso createNewFile()stesso controlla atomicamente l'esistenza del file.
Aztek,

8
@aztek probabilmente potremmo lasciare la condizione per migliorare la leggibilità del codice
Andrii Chernenko

2
createNewFile()è una totale perdita di tempo qui. Il sistema lo farà già. Lo stai solo forzando a sembrare due volte.
Marchese di Lorne,

61

Prima di creare un file, è necessario creare tutte le directory dei genitori.

Uso yourFile.getParentFile().mkdirs()


23

Puoi creare un file vuoto, che esista o no ...

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

se vuoi lasciare il file se esiste ...

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

Otterrai un FileNotFoundException solo se provi a creare il file in una directory che non esiste.


3
Genera FileNotFoundExceptionin entrambi i casi.
mixel,

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

Passalo fal tuo FileOutputStreamcostruttore.


2
C'è una condizione di competizione qui ... Meglio farlo come segue: File f = new File ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("Il file esiste già"); }
umanità

19

FileUtils di Apache Commons è un ottimo modo per raggiungere questo obiettivo in una sola riga.

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

Ciò creerà le cartelle padre se non esistono e creerà un file se non esiste e genererà un'eccezione se l'oggetto file è una directory o non può essere scritto. Ciò equivale a :

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

Tutte le operazioni di cui sopra genereranno un'eccezione se l'utente corrente non è autorizzato a eseguire l'operazione.


4

Crea file se non esiste. Se il file esce, cancella il suo contenuto:

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

Basta dare un modo alternativo per creare il file solo se non esiste usando 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());

0

È possibile ottenere potenzialmente un FileNotFoundExceptionse il file non esiste.

La documentazione Java dice:

La disponibilità o la creazione di un file dipende dalla piattaforma sottostante http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

Se stai usando Java 7 puoi usare il pacchetto java.nio:

Il parametro options specifica come viene creato o aperto il file ... apre il file per la scrittura, creando il file se non esiste ...

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


0

new FileOutputStream(f) creerà un file nella maggior parte dei casi, ma sfortunatamente otterrai FileNotFoundException

se il file esiste ma è una directory anziché un file normale, non esiste ma non può essere creato o non può essere aperto per altri motivi

da Javadoc

In altre parole, ci potrebbero essere molti casi in cui si otterrebbe FileNotFoundException che significa "Impossibile creare il file", ma non si è in grado di trovare il motivo per cui la creazione del file non è riuscita.

Una soluzione è rimuovere qualsiasi chiamata all'API File e utilizzare invece l'API File poiché fornisce una gestione degli errori molto migliore. Sostituire in genere qualsiasi new FileOutputStream(f)con Files.newOutputStream(p).

Nei casi in cui è necessario utilizzare l'API File (perché ad esempio si utilizza un'interfaccia esterna utilizzando File), l'utilizzo Files.createFile(p)è un buon modo per assicurarsi che il file sia stato creato correttamente e in caso contrario si saprebbe perché non ha funzionato. Alcune persone hanno commentato sopra che questo è ridondante. È vero, ma ottieni una migliore gestione degli errori che potrebbe essere necessaria in alcuni casi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.