Java FileOutputStream Utwórz plik, jeśli nie istnieje

187

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);
Stefan Dunn
źródło

Odpowiedzi:

302

Wyrzuci a, FileNotFoundExceptionjeś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); 
talikole
źródło
2
jeśli plik nie istnieje, jak mam utworzyć pusty plik .txt?
Stefan Dunn,
3
@StefanDunn z createNewFile()metodą, jak pokazano w moim przykładzie.
talnicolas
55
Warunek jest zbędny. Według JavaDoc , createNewFile()sama atomowo sprawdza istnienie pliku.
aztek
8
@aztek prawdopodobnie moglibyśmy pozostawić warunek poprawienia czytelności kodu
Andrii Chernenko
2
createNewFile()to całkowita strata czasu tutaj. System już to zrobi. Po prostu zmuszasz go, by wyglądał dwa razy.
Markiz Lorne
61

Przed utworzeniem pliku konieczne jest utworzenie wszystkich katalogów rodzica.

Posługiwać się yourFile.getParentFile().mkdirs()

Kostiantyn Medvid
źródło
23

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.

Peter Lawrey
źródło
3
Rzuca FileNotFoundExceptionw obu przypadkach.
mixel
21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Przekaż to fswojemu FileOutputStreamkonstruktorowi.

Shashank Kadne
źródło
2
Jest tu warunek wyścigu ... Lepiej to zrobić w następujący sposób: Plik f = nowy plik („Test.txt”); if (! f.createNewFile ()) {System.out.println („Plik już istnieje”); }
ludzkość
19

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.

Nikhil Sahu
źródło
4

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();
    }
}
Do Nhu Vy
źródło
2

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());
Manish Bansal
źródło
0

Możesz potencjalnie uzyskać, FileNotFoundExceptionjeś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

sikander
źródło
0

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

z Javadoc

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.

przepełniony stos
źródło