java 如果目录不存在,则创建一个目录,然后在该目录中创建文件

eeq64g8w  于 2023-11-15  发布在  Java
关注(0)|答案(9)|浏览(216)

条件是,如果目录存在,则必须在该特定目录中创建文件,而不创建新目录。
下面的代码只会在新目录下创建一个文件,而不会在现有目录下创建。例如,目录名可能是“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();

字符串

p5cysglq

p5cysglq1#

Java 8+版本:

import java.nio.file.Paths;
import java.nio.file.Files;

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

字符串
Files.createDirectories()创建一个新目录和不存在的父目录。如果目录已经存在,此方法不会抛出异常。

bvhaajcl

bvhaajcl2#

这段代码首先检查目录是否存在,如果不存在,就创建它,然后创建文件。请注意,我无法验证你的一些方法调用,因为我没有你的完整代码,所以我假设对getTimeStamp()getClassName()的调用可以工作。你还应该对可能的IOException做一些事情,当使用任何java.io.*类-您编写文件的函数应该抛出此异常(它可以在其他地方处理),或者你应该直接在方法中处理它。另外,我假设idString类型-我不知道,因为你的代码没有显式定义它。如果它是类似int的其他类型,在fileName中使用它之前,你可能应该将它转换为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,包括目录已经存在的情况。
uhry853o

uhry853o3#

尝试使这尽可能的短和简单。如果它不存在,则创建目录,然后返回所需的文件:

/** 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);
}

字符串

btxsgosb

btxsgosb4#

我想为Java8+提供以下建议。

/**
 * Creates a File if the file does not exist, or returns a
 * reference to the File if it already exists.
 */
public File createOrRetrieve(final String target) throws IOException {
  final File answer;
  Path path = Paths.get(target);
  Path parent = path.getParent();
  if(parent != null && Files.notExists(parent)) {
    Files.createDirectories(path);
  }
  if(Files.notExists(path)) {
    LOG.info("Target file \"" + target + "\" will be created.");
    answer = Files.createFile(path).toFile();
  } else {
    LOG.info("Target file \"" + target + "\" will be retrieved.");
    answer = path.toFile();
  }
  return answer;
}

字符串
编辑:更新以修复@Cataclysm和@Marcono1234所指出的错误。Thx guys:)

vdzxcuhz

vdzxcuhz5#

使用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);
    }

字符串

3gtaxfhh

3gtaxfhh6#

验证码:

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

}

字符串

lyfkaqu1

lyfkaqu17#

如果你创建一个基于web的应用程序,更好的解决方案是检查目录是否存在,如果不存在,则创建文件。如果存在,则重新创建。

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

字符串

csbfibhn

csbfibhn8#

使用Java 8的简单解决方案

public void init(String multipartLocation) throws IOException {
    File storageDirectory = new File(multipartLocation);

    if (!storageDirectory.exists()) {
        if (!storageDirectory.mkdir()) {
            throw new IOException("Error creating directory.");
        }
    }
}

字符串

w80xi6nr

w80xi6nr9#

如果你使用的是Java 8或更高版本,那么Files.createDirectories()方法效果最好。

相关问题