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);
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:
Lancerà a FileNotFoundException
se 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);
createNewFile()
metodo, come mostrato nel mio esempio.
createNewFile()
è una totale perdita di tempo qui. Il sistema lo farà già. Lo stai solo forzando a sembrare due volte.
Prima di creare un file, è necessario creare tutte le directory dei genitori.
Uso yourFile.getParentFile().mkdirs()
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.
FileNotFoundException
in entrambi i casi.
File f = new File("Test.txt");
if(!f.exists()){
f.createNewFile();
}else{
System.out.println("File already exists");
}
Passalo f
al tuo FileOutputStream
costruttore.
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.
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();
}
}
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());
È possibile ottenere potenzialmente un FileNotFoundException
se 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
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
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.