Czy istnieje sposób użycia FileOutputStream w taki sposób, że jeśli plik (nazwa pliku String) nie istnieje, to go utworzy?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
Czy istnieje sposób użycia FileOutputStream w taki sposób, że jeśli plik (nazwa pliku String) nie istnieje, to go utworzy?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
Odpowiedzi:
Wyrzuci a, FileNotFoundException
jeśli plik nie istnieje i nie można go utworzyć ( doc ), ale utworzy go, jeśli będzie mógł. Aby się upewnić, prawdopodobnie powinieneś najpierw sprawdzić, czy plik istnieje przed utworzeniem FileOutputStream
(i utworzyć za pomocą, createNewFile()
jeśli nie ma):
File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing
FileOutputStream oFile = new FileOutputStream(yourFile, false);
createNewFile()
metodą, jak pokazano w moim przykładzie.
createNewFile()
to całkowita strata czasu tutaj. System już to zrobi. Po prostu zmuszasz go, by wyglądał dwa razy.
Przed utworzeniem pliku konieczne jest utworzenie wszystkich katalogów rodzica.
Posługiwać się yourFile.getParentFile().mkdirs()
Możesz utworzyć pusty plik, czy istnieje, czy nie ...
new FileOutputStream("score.txt", false).close();
jeśli chcesz zostawić plik, jeśli istnieje ...
new FileOutputStream("score.txt", true).close();
FileNotFoundException otrzymasz tylko wtedy, gdy spróbujesz utworzyć plik w katalogu, który nie istnieje.
FileNotFoundException
w obu przypadkach.
File f = new File("Test.txt");
if(!f.exists()){
f.createNewFile();
}else{
System.out.println("File already exists");
}
Przekaż to f
swojemu FileOutputStream
konstruktorowi.
FileUtils z apache commons jest całkiem dobrym sposobem na osiągnięcie tego w jednym wierszu.
FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))
Spowoduje to utworzenie folderów nadrzędnych, jeśli nie istnieją, i utworzenie pliku, jeśli nie istnieje, i wygenerowanie wyjątku, jeśli obiekt pliku jest katalogiem lub nie można go zapisać. Jest to równoważne z :
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);
Wszystkie powyższe operacje spowodują wyjątek, jeśli bieżący użytkownik nie będzie mógł wykonać operacji.
Utwórz plik, jeśli nie istnieje. Jeśli plik zostanie zamknięty, wyczyść jego zawartość:
/**
* 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();
}
}
Po prostu dając alternatywny sposób utworzenia pliku tylko wtedy, gdy nie istnieje przy użyciu ścieżki i plików.
Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
Files.createFile(path);
Files.write(path, ("").getBytes());
Możesz potencjalnie uzyskać, FileNotFoundException
jeśli plik nie istnieje.
Dokumentacja Java mówi:
To, czy plik jest dostępny, czy może zostać utworzony, zależy od platformy http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html
Jeśli używasz Java 7, możesz użyć pakietu java.nio:
Parametr options określa, w jaki sposób plik jest tworzony lub otwierany ... otwiera plik do zapisu, tworząc plik, jeśli nie istnieje ...
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
new FileOutputStream(f)
utworzy plik w większości przypadków, ale niestety otrzymasz wyjątek FileNotFoundException
jeśli plik istnieje, ale jest katalogiem, a nie zwykłym plikiem, nie istnieje, ale nie można go utworzyć lub nie można go otworzyć z jakiegokolwiek innego powodu
Innymi słowy, może istnieć wiele przypadków, w których można uzyskać wyjątek FileNotFoundException oznaczający „Nie można utworzyć pliku”, ale nie można znaleźć przyczyny niepowodzenia tworzenia pliku.
Rozwiązaniem jest usunięcie dowolnego wywołania interfejsu API plików i użycie zamiast tego interfejsu API plików, ponieważ zapewnia on znacznie lepszą obsługę błędów. Zazwyczaj zastąpić dowolny new FileOutputStream(f)
z Files.newOutputStream(p)
.
W przypadkach, w których musisz użyć interfejsu API plików (ponieważ korzystasz z zewnętrznego interfejsu za pomocą na przykład pliku), użycie Files.createFile(p)
jest dobrym sposobem na upewnienie się, że plik został poprawnie utworzony, a jeśli nie, to wiesz, dlaczego nie działa. Niektóre osoby skomentowały powyżej, że jest to zbędne. To prawda, ale masz lepszą obsługę błędów, która może być konieczna w niektórych przypadkach.