如果目录不存在,则创建一个目录,然后在该目录中也创建文件
Create a directory if it does not exist and then create the files in that directory as well
条件是如果该目录存在,它必须在该特定目录中创建文件而不创建新目录。
下面的代码只用新目录创建文件,不为现有目录创建文件。例如,目录名称类似于“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();
此代码首先检查目录是否存在,如果不存在则创建目录,然后创建文件。请注意,我无法验证您的某些方法调用,因为我没有您的完整代码,因此我假设对 getTimeStamp()
和 getClassName()
之类的调用会起作用。您还应该对使用任何 java.io.*
类 时可能抛出的 IOException
做一些事情 - 写入文件的函数应该抛出此异常(并在其他地方处理) ), 或者你应该直接在方法中进行。另外,我假设 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()
调用将 return true
如果它创建了一个目录,如果没有创建 false
,包括目录已经存在的情况。
代码:
// 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);
}
我建议 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();
}
努力使这个尽可能简短。如果目录不存在则创建目录,然后 returns 所需的文件:
/** 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);
}
使用 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);
}
如果您创建基于 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;
}
Java 8+ 版本:
Files.createDirectories(Paths.get("/Your/Path/Here"));
Files.createDirectories()
创建了一个新目录和不存在的父目录。如果目录已经存在,此方法不会抛出异常。
条件是如果该目录存在,它必须在该特定目录中创建文件而不创建新目录。
下面的代码只用新目录创建文件,不为现有目录创建文件。例如,目录名称类似于“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();
此代码首先检查目录是否存在,如果不存在则创建目录,然后创建文件。请注意,我无法验证您的某些方法调用,因为我没有您的完整代码,因此我假设对 getTimeStamp()
和 getClassName()
之类的调用会起作用。您还应该对使用任何 java.io.*
类 时可能抛出的 IOException
做一些事情 - 写入文件的函数应该抛出此异常(并在其他地方处理) ), 或者你应该直接在方法中进行。另外,我假设 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()
调用将 return true
如果它创建了一个目录,如果没有创建 false
,包括目录已经存在的情况。
代码:
// 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);
}
我建议 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();
}
努力使这个尽可能简短。如果目录不存在则创建目录,然后 returns 所需的文件:
/** 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);
}
使用 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);
}
如果您创建基于 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;
}
Java 8+ 版本:
Files.createDirectories(Paths.get("/Your/Path/Here"));
Files.createDirectories()
创建了一个新目录和不存在的父目录。如果目录已经存在,此方法不会抛出异常。