java创建文件和文件夹

at java.io.WinNTFileSystem.createFileExclusively
在java开发过程中总是会遇到操纵file类的情况,最常见的需求就是创建文件和文件夹。以下是解决方案:

   /**
     * 创建文件顺便创建父目录
     *
     * @param path 文件字符串路径例如d:/fulld/why/ass/a/asd
     */
    public static void createFile(String path) {
        createFile(new File(path));
    }

    /**
     * 创建文件顺便创建父目录
     *
     * @param file file类
     */
    private static void createFile(File file) {
        if (file.exists() && file.isFile()) {
            file.delete();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        File parentFile = file.getParentFile();
        if (parentFile.exists()) {
            if (parentFile.isFile()) {
                parentFile.delete();
                parentFile.mkdirs();
            }
        } else {
            parentFile.mkdirs();
        }
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件夹顺便创建父目录
     *
     * @param path 文件夹的路径字符串例如d:/fulld/why/ass/a/asd/
     * @return 如果本来就存在或者创建成功,那么就返回true
     */
    public static void mkdirs(String path) {
        mkdirs(new File(path));
    }

    /**
     * 创建文件夹顺便创建父目录
     *
     * @param file file类
     */
    public static void mkdirs(File file) {
        if (file.exists() && file.isDirectory()) {
            return;
        }
        if (file.exists()) {
            file.delete();
            file.mkdirs();
        } else {
            file.mkdirs();
        }
    }

以上是解决方案,下面是错误演示:
而java API很明显没有直接创建文件不报错的。这里写一个方法来创建文件和文件夹。

    public static boolean createFileOrDir(String path) {
        return createFileOrDir(new File(path));
    }

    private static boolean createFileOrDir(File file) {
        System.out.println(file.getPath());
        if (file.isDirectory()) {
            return file.mkdirs();
        }
        File parentFile = file.getParentFile();
        if (!parentFile.exists()) {
            System.out.println(parentFile.getPath());
            boolean mkdirs = parentFile.mkdirs();
            if (!mkdirs)
                return false;
        } else {
            if (!parentFile.isDirectory()) {
                boolean delete = parentFile.delete();
                boolean mkdirs = parentFile.mkdirs();
                if (!delete || !mkdirs) return false;
            }
        }
        try {
            return file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

用法也很简单

public class HeHe {
    public static void main(String[] args) {
        System.out.println(createFileOrDir("d:/fulld/why/ass/a/asd/"));
    }

}

然后你就会在你的D盘下面有这么一堆的东西,这里有个问题就是不管你最后加没有/最后一个文件夹没有创建都会默认为文件,如下图:
这里写图片描述

表情
what the fuck!

用file.getpath也是d:/fulld/why/ass/a/asd而不是d:/fulld/why/ass/a/asd/所以我觉得这个地方是个坑啊,也就是我没有办法保证最后一个创建的是文件夹,如果不存在创建的永远都是文件。mmp真的坑。

然后咱们看看File的mkdirs方法

* @return  <code>true</code> if and only if the directory was created,
*          along with all necessary parent directories; <code>false</code>
*          otherwise

这个注释翻译过来,只有这个子目录单独创建成功的时候才会返回true,又是一个坑。所以返回值都没有什么太大的意义了。
以上是错误示范,经过整理之后就形成了最上面的四个方法。

猜你喜欢

转载自blog.csdn.net/arios171/article/details/81097636