Utwórz automatycznie pełną ścieżkę podczas zapisywania do nowego pliku


246

Chcę napisać nowy plik za pomocą FileWriter. Używam tego w ten sposób:

FileWriter newJsp = new FileWriter("C:\\user\Desktop\dir1\dir2\filename.txt");

Teraz dir1i dir2obecnie nie istnieją. Chcę, aby Java tworzyła je automatycznie, jeśli jeszcze ich tam nie ma. W rzeczywistości Java powinna skonfigurować całą ścieżkę do pliku, jeśli jeszcze nie istnieje.

Jak mogę to osiągnąć?

Odpowiedzi:


431

Coś jak:

File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file);

11
Dlaczego getParentFile, a nie tylko mkdir?
sauperl

Czy zastąpi poprzedni folder, jeśli ponownie wydam ten sam kod z innym plikiem rodzeństwa?
surajs1n

1
@ surajs1n: Jeśli katalog już istnieje, mkdirsnic nie zrobi.
Jon Skeet

3
@sauperl: Jeśli plik jeszcze nie istnieje, mkdirs () przyjmuje, że wszystko, co określone, to katalog i tworzy go jako taki (właśnie go przetestował). Korzystając z getParentFile () , pozostawiasz tworzenie samego pliku do FileWriter .
h4nek

149

Od wersji Java 1.7 możesz używać Files.createFile:

Path pathToFile = Paths.get("/home/joe/foo/bar/myFile.txt");
Files.createDirectories(pathToFile.getParent());
Files.createFile(pathToFile);

4
Ważne jest, aby pamiętać, że ścieżki względne mogą powodować wyjątek wskaźnika zerowego. Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Mag

if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // Sprawdź, czy katalog już istnieje, aby uniknąć błędu
Andre Nel,

29

Użyj File.mkdirs():

File dir = new File("C:\\user\\Desktop\\dir1\\dir2");
dir.mkdirs();
File file = new File(dir, "filename.txt");
FileWriter newJsp = new FileWriter(file);


4

Użyj FileUtils, aby poradzić sobie z tymi wszystkimi bólami głowy.

Edycja: na przykład użyj poniższego kodu, aby zapisać do pliku, ta metoda „sprawdzi i utworzy katalog nadrzędny, jeśli nie istnieje”.

openOutputStream(File file [, boolean append]) 

1
Czy mógłbyś być bardziej szczegółowy?
Jean

Cześć Jean, pod redakcją. Istnieje wiele innych przydatnych metod w FileUtils. Klasy IO Apache Commons, takie jak OIUtils i FileUtils, ułatwiają życie programistom Java.
kakacii

1
Zgadzam się, FileUtils to dobry sposób, ale myślę, że łatwiejszym sposobem jest użycie writeStringToFile, a nie openOutputStream. Np. Plik plik = nowy plik („C: /user/Desktop/dir1/dir2/filename.txt”); FileUtils.writeStringToFile (plik, „foo bar baz”, prawda);
Paul

Dziękuję za to . Teraz mój kod jest znacznie czystszy. Link do najnowszego javadoc: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
Nikhil Sahu
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.