Создайте каталог, если он не существует, а затем создайте файлы в этом каталоге.

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

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

String PATH = "/remote/dir/server/";

String fileName = PATH.append(id).concat(getTimeStamp()).append(".txt");  

String directoryName = PATH.append(this.getClassName());   

File file  = new File(String.valueOf(fileName));

File directory = new File(String.valueOf(directoryName));

 if(!directory.exists()){

             directory.mkdir();
            if(!file.exists() && !checkEnoughDiskSpace()){
                file.getParentFile().mkdir();
                file.createNewFile();
            }
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(value);
bw.close();

person Sri    schedule 09.03.2015    source источник


Ответы (7)


Этот код сначала проверяет наличие каталога и создает его, если нет, а затем создает файл. Обратите внимание, что я не смог проверить некоторые из ваших вызовов методов, так как у меня нет вашего полного кода, поэтому я предполагаю, что вызовы таких вещей, как getTimeStamp() и getClassName(), будут работать. Вы также должны что-то сделать с возможным IOException, которое может быть выброшено при использовании любого из классов java.io.* - либо ваша функция, записывающая файлы, должна генерировать это исключение (и оно будет обрабатываться в другом месте), либо вы должны сделать это непосредственно в методе. Кроме того, я предположил, что id имеет тип String - я не знаю, так как ваш код не определяет его явно. Если это что-то вроде int, вам, вероятно, следует преобразовать его в String, прежде чем использовать его в имени файла, как я сделал здесь.

Кроме того, я заменил ваши звонки append на concat или + по своему усмотрению.

public void writeFile(String value){
    String PATH = "/remote/dir/server/";
    String directoryName = PATH.concat(this.getClassName());
    String fileName = id + getTimeStamp() + ".txt";

    File directory = new File(directoryName);
    if (! directory.exists()){
        directory.mkdir();
        // If you require it to make the entire directory path including parents,
        // use directory.mkdirs(); here instead.
    }

    File file = new File(directoryName + "/" + fileName);
    try{
        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(value);
        bw.close();
    }
    catch (IOException e){
        e.printStackTrace();
        System.exit(-1);
    }
}

Вероятно, вам не следует использовать такие пустые имена путей, если вы хотите запустить код в Microsoft Windows — я не уверен, что он будет делать с / в именах файлов. Для полной переносимости вам, вероятно, следует использовать что-то вроде File.separator для построения ваших путей.

Изменить: Согласно комментарию JosefScript ниже, нет необходимости проверять наличие каталога. Вызов directory.mkdir() вернет true, если он создал каталог, и false, если нет, включая случай, когда каталог уже существует.

person Aaron D    schedule 09.03.2015
comment
звонки работают нормально. КОГДА я попробовал вышеприведенную часть совместной работы, он все еще записывает файл в PATH, но не в каталог. Я использовал File.seperator для создания нового файла. - person Sri; 09.03.2015
comment
Пожалуйста, точно объясните (с именами классов и образцами переменных), какой результат вы ожидаете. Я полностью прикрепил свой пример программы здесь pastebin.com/3eEg6jQv, чтобы вы могли видеть, что она делает то, что вам нужно. описывают (насколько я понимаю). - person Aaron D; 09.03.2015
comment
Файл файл = новый файл (имя_каталога + / + имя_файла); я заменил приведенный выше фрагмент кода на StringBuffer fullFilePath = new StringBuffer(directoryName).append(File.separator).append(fileName); Файл файл = новый файл (String.valueOf (полный путь к файлу)); и это сработало - person Sri; 09.03.2015
comment
В этом случае вы можете использовать mkdirs() метод. - person Aaron D; 10.01.2017
comment
Почему вы должны проверять существование каталога? Я поиграл с этим, и, насколько я вижу, это не имеет значения, если я дважды создам один и тот же каталог. Даже содержащиеся файлы не будут перезаписаны. Я что-то упускаю? - person JosefScript; 11.01.2017
comment
Нет, наверное, нет. Проблема заключалась в том, чтобы «создать каталог, если он не существует», поэтому мой код отражает эту логику, но реализация этого вызова JVM, вероятно, не уничтожит данные, если вы скажете ему создать каталог, который уже существует , так что вы можете вызвать его без проверки. Если каталог действительно создан, вызов вернет true, иначе false. Я добавлю примечание по этому поводу, спасибо. - person Aaron D; 12.01.2017
comment
Насколько мне известно, в Java (по крайней мере, в Java 8) теперь используются косые черты, которые являются разделителями каталогов как в Windows, так и (очевидно) в Linux. - person Jared; 14.11.2020

Версия Java 8+:

Files.createDirectories(Paths.get("/Your/Path/Here"));

Files.createDirectories() создает новый каталог и несуществующие родительские каталоги. Этот метод не генерирует исключение, если каталог уже существует.

person Inês Gomes    schedule 17.12.2019
comment
Что произойдет, если для создания требуется разрешение? - person Ajay Takur; 14.07.2020
comment
Для Android работает только с API 26 и выше, поэтому обязательно проверьте эту строку, если (Build.VERSION.SDK_INT ›= Build.VERSION_CODES.O) developer.android.com/ ссылка/java/nio/файл/ - person Arpit Patel; 05.10.2020
comment
@AjayTakur Если у вас нет разрешения на запись в каталоге, в котором вы пытаетесь создать новый каталог, возникает исключение IOException. - person Thor Lancaster; 12.12.2020

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

/** Creates parent directories if necessary. Then returns file */
private static File fileWithDirectoryAssurance(String directory, String filename) {
    File dir = new File(directory);
    if (!dir.exists()) dir.mkdirs();
    return new File(directory + "/" + filename);
}
person Jacob R    schedule 31.01.2018
comment
Лучше использовать File.separatorChar вместо /. - person cactuschibre; 12.06.2018

Я бы предложил следующее для Java8+.

/**
 * Creates a File if the file does not exist, or returns a
 * reference to the File if it already exists.
 */
private File createOrRetrieve(final String target) throws IOException{

    final Path path = Paths.get(target);

    if(Files.notExists(path)){
        LOG.info("Target file \"" + target + "\" will be created.");
        return Files.createFile(Files.createDirectories(path)).toFile();
    }
    LOG.info("Target file \"" + target + "\" will be retrieved.");
    return path.toFile();
}

/**
 * Deletes the target if it exists then creates a new empty file.
 */
private File createOrReplaceFileAndDirectories(final String target) throws IOException{

    final Path path = Paths.get(target);
    // Create only if it does not exist already
    Files.walk(path)
        .filter(p -> Files.exists(p))
        .sorted(Comparator.reverseOrder())
        .peek(p -> LOG.info("Deleted existing file or directory \"" + p + "\"."))
        .forEach(p -> {
            try{
                Files.createFile(Files.createDirectories(p));
            }
            catch(IOException e){
                throw new IllegalStateException(e);
            }
        });

    LOG.info("Target file \"" + target + "\" will be created.");

    return Files.createFile(
        Files.createDirectories(path)
    ).toFile();
}
person Pytry    schedule 15.09.2017
comment
Files.createFile(Files.createDirectories(path)).toFile() должно быть Files.createDirectories(path).toFile() по Access Denied причине. - person Cataclysm; 11.09.2018
comment
@Pytry, Files.createFile(Files.createDirectories(path)) не работает, как описано в комментарии выше. createDirectories уже создает каталог с именем файла, например. test.txt, поэтому createFile не удастся. - person Marcono1234; 15.03.2019

код:

// Create Directory if not exist then Copy a file.


public static void copyFile_Directory(String origin, String destDir, String destination) throws IOException {

    Path FROM = Paths.get(origin);
    Path TO = Paths.get(destination);
    File directory = new File(String.valueOf(destDir));

    if (!directory.exists()) {
        directory.mkdir();
    }
        //overwrite the destination file if it exists, and copy
        // the file attributes, including the rwx permissions
     CopyOption[] options = new CopyOption[]{
                StandardCopyOption.REPLACE_EXISTING,
                StandardCopyOption.COPY_ATTRIBUTES

        };
        Files.copy(FROM, TO, options);


}
person Mukesh    schedule 05.05.2017

Используя java.nio.Path было бы довольно просто -

public static Path createFileWithDir(String directory, String filename) {
        File dir = new File(directory);
        if (!dir.exists()) dir.mkdirs();
        return Paths.get(directory + File.separatorChar + filename);
    }
person Saikat    schedule 09.01.2019

Если вы создаете веб-приложение, лучшим решением будет проверить, существует каталог или нет, а затем создать файл, если он не существует. Если существует, создайте заново.

    private File createFile(String path, String fileName) throws IOException {
       ClassLoader classLoader = getClass().getClassLoader();
       File file = new File(classLoader.getResource(".").getFile() + path + fileName);

       // Lets create the directory
       try {
          file.getParentFile().mkdir();
       } catch (Exception err){
           System.out.println("ERROR (Directory Create)" + err.getMessage());
       }

       // Lets create the file if we have credential
       try {
           file.createNewFile();
       } catch (Exception err){
           System.out.println("ERROR (File Create)" + err.getMessage());
       }
       return  file;
   }
person Dr. X    schedule 14.11.2019