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

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

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


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.


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.


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.


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

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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.