Создать весь путь автоматически при записи в новый файл


246

Я хочу написать новый файл с FileWriter. Я использую это так:

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

Сейчас dir1и в dir2настоящее время не существует. Я хочу, чтобы Java создавала их автоматически, если их там еще нет. На самом деле Java должна установить полный путь к файлу, если он еще не существует.

Как мне этого добиться?

Ответы:


431

Что-то вроде:

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

11
Почему getParentFile, а не просто mkdirs?
sauperl

Будет ли он переопределять предыдущую папку, если я переиздаю один и тот же код с другим файлом?
surajs1n

1
@ surajs1n: Если каталог уже существует, mkdirsничего не будет делать.
Джон Скит

3
@sauperl: если файл еще не существует, mkdirs () будет считать, что все указанное является каталогом, и создаст его как таковой (только что проверил). Используя getParentFile () , вы оставляете создание самого файла на FileWriter .
h4nek

149

Начиная с Java 1.7 вы можете использовать Files.createFile:

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

4
Важно помнить, что относительные пути могут вызвать исключение нулевого указателя. Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Маг

if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // Проверка, если каталог уже существует, чтобы избежать ошибки
Andre Nel

29

использование 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

Используйте FileUtils для обработки всех этих головных болей.

Редактировать: например, используйте приведенный ниже код для записи в файл, этот метод будет «проверять и создавать родительский каталог, если он не существует».

openOutputStream(File file [, boolean append]) 

1
Пожалуйста, не могли бы вы быть более конкретным?
Жан

Привет Жан, Отредактировано. В FileUtils есть целый ряд других полезных методов. Классы ввода-вывода Apache Commons, такие как OIUtils и FileUtils, облегчают жизнь Java-разработчикам.
Какация

1
Я согласен, что FileUtils - это хороший способ, но я думаю, что более простой способ - использовать writeStringToFile, а не openOutputStream. Например, файл file = new File ("C: /user/Desktop/dir1/dir2/filename.txt"); FileUtils.writeStringToFile (файл, "foo bar baz", true);
Пол

Спасибо за это . Сделал мой код намного чище сейчас. Ссылка на недавний javadoc: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
Никхил Саху,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.