zoukankan      html  css  js  c++  java
  • Java File类总结和FileUtils类

     

     Java File类总结和FileUtils类

     

    文件存在和类型判断

      创建出File类的对象并不代表该路径下有此文件或目录。

      用public boolean exists()可以判断文件是否存在。

     

      File类的对象可以是目录或者文件。

      如果是目录,public boolean isDirectory()返回true;

      如果是文件(非目录则是文件),public boolean isFile()返回true;

      但是注意需要先判断文件是否存在,如果文件不存在,上面两个方法都返回false,即不存在的File类对象既不是文件也不是目录

     

    创建文件

      public boolean createNewFile()会创建一个新的空文件,只有该文件不存在的时候会创建,如果文件已经存在的话则返回false。

    创建文件夹

      public boolean mkdir()

      创建目录,成功返回true。只能创建一个文件夹,要求所有的父目录都存在,否则创建失败。

      public boolean mkdirs()

      创建目录,成功返回true,会创建所有不存在的父目录。(注意即便最后创建失败,但是也可能创建了一些中间目录)。

      上面两个方法如果要创建的目录已经存在,不再重新创建,都返回false,只有新建目录返回true。

    目录操作

      列出目录中的文件有以下方法可选:

      String[] list()

      String[] list(FilenameFilter filter)

      返回文件名数组。

      File[] listFiles()

      File[] listFiles(FileFilter filter)

      File[] listFiles(FilenameFilter filter)

      返回File数组。

     

      参数是文件或者文件名过滤器。

      注意返回为空和返回为null的意义是不同的。

      若不包含(符合条件的)文件,返回为空。

      但是如果返回为null,则表明调用方法的File对象可能不是一个目录,或者发生了IO错误。

    删除文件

      boolean delete()方法会删除文件,如果File对象是文件则直接删除,对于目录来说,如果是空目录则直接删除,非空目录则无法删除,返回false。

      如果要删除的文件不能被删除则会抛出IOException。

     

      注意:不论是创建文件、创建目录还是删除文件,只有在动作真正发生的时候会返回true。

    FileUtils类

      在项目中写一些工具类包装通用操作是很有必要的,看了一下apache的FileUtils类,copy了一些方法出来:

    /*
     * Licensed to the Apache Software Foundation (ASF) under one or more
     * contributor license agreements.  See the NOTICE file distributed with
     * this work for additional information regarding copyright ownership.
     * The ASF licenses this file to You under the Apache License, Version 2.0
     * (the "License"); you may not use this file except in compliance with
     * the License.  You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package com.mengdd.file;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /*
     * FileUtils copied from org.apache.commons.io.FileUtils
     */
    public class FileUtils {
        /**
         * Construct a file from the set of name elements.
         *
         * @param directory
         *            the parent directory
         * @param names
         *            the name elements
         * @return the file
         */
        public static File getFile(File directory, String... names) {
            if (directory == null) {
                throw new NullPointerException(
                        "directorydirectory must not be null");
            }
            if (names == null) {
                throw new NullPointerException("names must not be null");
            }
            File file = directory;
            for (String name : names) {
                file = new File(file, name);
            }
            return file;
        }
    
        /**
         * Construct a file from the set of name elements.
         *
         * @param names
         *            the name elements
         * @return the file
         */
        public static File getFile(String... names) {
            if (names == null) {
                throw new NullPointerException("names must not be null");
            }
            File file = null;
            for (String name : names) {
                if (file == null) {
                    file = new File(name);
                }
                else {
                    file = new File(file, name);
                }
            }
            return file;
        }
    
        /**
         * Opens a {@link FileInputStream} for the specified file, providing better
         * error messages than simply calling <code>new FileInputStream(file)</code>
         * .
         * <p>
         * At the end of the method either the stream will be successfully opened,
         * or an exception will have been thrown.
         * <p>
         * An exception is thrown if the file does not exist. An exception is thrown
         * if the file object exists but is a directory. An exception is thrown if
         * the file exists but cannot be read.
         *
         * @param file
         *            the file to open for input, must not be {@code null}
         * @return a new {@link FileInputStream} for the specified file
         * @throws FileNotFoundException
         *             if the file does not exist
         * @throws IOException
         *             if the file object is a directory
         * @throws IOException
         *             if the file cannot be read
         */
        public static FileInputStream openInputStream(File file) throws IOException {
            if (file.exists()) {
                if (file.isDirectory()) {
                    throw new IOException("File '" + file
                            + "' exists but is a directory");
                }
                if (file.canRead() == false) {
                    throw new IOException("File '" + file + "' cannot be read");
                }
            }
            else {
                throw new FileNotFoundException("File '" + file
                        + "' does not exist");
            }
            return new FileInputStream(file);
        }
    
        /**
         * Opens a {@link FileOutputStream} for the specified file, checking and
         * creating the parent directory if it does not exist.
         * <p>
         * At the end of the method either the stream will be successfully opened,
         * or an exception will have been thrown.
         * <p>
         * The parent directory will be created if it does not exist. The file will
         * be created if it does not exist. An exception is thrown if the file
         * object exists but is a directory. An exception is thrown if the file
         * exists but cannot be written to. An exception is thrown if the parent
         * directory cannot be created.
         *
         * @param file
         *            the file to open for output, must not be {@code null}
         * @param append
         *            if {@code true}, then bytes will be added to the
         *            end of the file rather than overwriting
         * @return a new {@link FileOutputStream} for the specified file
         * @throws IOException
         *             if the file object is a directory
         * @throws IOException
         *             if the file cannot be written to
         * @throws IOException
         *             if a parent directory needs creating but that fails
         */
        public static FileOutputStream openOutputStream(File file, boolean append)
                throws IOException {
            if (file.exists()) {
                if (file.isDirectory()) {
                    throw new IOException("File '" + file
                            + "' exists but is a directory");
                }
                if (file.canWrite() == false) {
                    throw new IOException("File '" + file
                            + "' cannot be written to");
                }
            }
            else {
                File parent = file.getParentFile();
                if (parent != null) {
                    if (!parent.mkdirs() && !parent.isDirectory()) {
                        throw new IOException("Directory '" + parent
                                + "' could not be created");
                    }
                }
            }
            return new FileOutputStream(file, append);
        }
    
        public static FileOutputStream openOutputStream(File file)
                throws IOException {
            return openOutputStream(file, false);
        }
    
        /**
         * Cleans a directory without deleting it.
         *
         * @param directory
         *            directory to clean
         * @throws IOException
         *             in case cleaning is unsuccessful
         */
        public static void cleanDirectory(File directory) throws IOException {
            if (!directory.exists()) {
                String message = directory + " does not exist";
                throw new IllegalArgumentException(message);
            }
    
            if (!directory.isDirectory()) {
                String message = directory + " is not a directory";
                throw new IllegalArgumentException(message);
            }
    
            File[] files = directory.listFiles();
            if (files == null) { // null if security restricted
                throw new IOException("Failed to list contents of " + directory);
            }
    
            IOException exception = null;
            for (File file : files) {
                try {
                    forceDelete(file);
                }
                catch (IOException ioe) {
                    exception = ioe;
                }
            }
    
            if (null != exception) {
                throw exception;
            }
        }
    
        // -----------------------------------------------------------------------
        /**
         * Deletes a directory recursively.
         *
         * @param directory
         *            directory to delete
         * @throws IOException
         *             in case deletion is unsuccessful
         */
        public static void deleteDirectory(File directory) throws IOException {
            if (!directory.exists()) {
                return;
            }
    
            cleanDirectory(directory);
    
            if (!directory.delete()) {
                String message = "Unable to delete directory " + directory + ".";
                throw new IOException(message);
            }
        }
    
        /**
         * Deletes a file. If file is a directory, delete it and all
         * sub-directories.
         * <p>
         * The difference between File.delete() and this method are:
         * <ul>
         * <li>A directory to be deleted does not have to be empty.</li>
         * <li>You get exceptions when a file or directory cannot be deleted.
         * (java.io.File methods returns a boolean)</li>
         * </ul>
         *
         * @param file
         *            file or directory to delete, must not be {@code null}
         * @throws NullPointerException
         *             if the directory is {@code null}
         * @throws FileNotFoundException
         *             if the file was not found
         * @throws IOException
         *             in case deletion is unsuccessful
         */
        public static void forceDelete(File file) throws IOException {
            if (file.isDirectory()) {
                deleteDirectory(file);
            }
            else {
                boolean filePresent = file.exists();
                if (!file.delete()) {
                    if (!filePresent) {
                        throw new FileNotFoundException("File does not exist: "
                                + file);
                    }
                    String message = "Unable to delete file: " + file;
                    throw new IOException(message);
                }
            }
        }
    
        /**
         * Deletes a file, never throwing an exception. If file is a directory,
         * delete it and all sub-directories.
         * <p>
         * The difference between File.delete() and this method are:
         * <ul>
         * <li>A directory to be deleted does not have to be empty.</li>
         * <li>No exceptions are thrown when a file or directory cannot be deleted.</li>
         * </ul>
         *
         * @param file
         *            file or directory to delete, can be {@code null}
         * @return {@code true} if the file or directory was deleted, otherwise
         *         {@code false}
         *
         */
        public static boolean deleteQuietly(File file) {
            if (file == null) {
                return false;
            }
            try {
                if (file.isDirectory()) {
                    cleanDirectory(file);
                }
            }
            catch (Exception ignored) {
            }
    
            try {
                return file.delete();
            }
            catch (Exception ignored) {
                return false;
            }
        }
    
        /**
         * Makes a directory, including any necessary but nonexistent parent
         * directories. If a file already exists with specified name but it is
         * not a directory then an IOException is thrown.
         * If the directory cannot be created (or does not already exist)
         * then an IOException is thrown.
         *
         * @param directory
         *            directory to create, must not be {@code null}
         * @throws NullPointerException
         *             if the directory is {@code null}
         * @throws IOException
         *             if the directory cannot be created or the file already exists
         *             but is not a directory
         */
        public static void forceMkdir(File directory) throws IOException {
            if (directory.exists()) {
                if (!directory.isDirectory()) {
                    String message = "File " + directory + " exists and is "
                            + "not a directory. Unable to create directory.";
                    throw new IOException(message);
                }
            }
            else {
                if (!directory.mkdirs()) {
                    // Double-check that some other thread or process hasn't made
                    // the directory in the background
                    if (!directory.isDirectory()) {
                        String message = "Unable to create directory " + directory;
                        throw new IOException(message);
                    }
                }
            }
        }
    
        /**
         * Returns the size of the specified file or directory. If the provided
         * {@link File} is a regular file, then the file's length is returned.
         * If the argument is a directory, then the size of the directory is
         * calculated recursively. If a directory or subdirectory is security
         * restricted, its size will not be included.
         *
         * @param file
         *            the regular file or directory to return the size
         *            of (must not be {@code null}).
         *
         * @return the length of the file, or recursive size of the directory,
         *         provided (in bytes).
         *
         * @throws NullPointerException
         *             if the file is {@code null}
         * @throws IllegalArgumentException
         *             if the file does not exist.
         *
         */
        public static long sizeOf(File file) {
    
            if (!file.exists()) {
                String message = file + " does not exist";
                throw new IllegalArgumentException(message);
            }
    
            if (file.isDirectory()) {
                return sizeOfDirectory(file);
            }
            else {
                return file.length();
            }
    
        }
    
        /**
         * Counts the size of a directory recursively (sum of the length of all
         * files).
         *
         * @param directory
         *            directory to inspect, must not be {@code null}
         * @return size of directory in bytes, 0 if directory is security
         *         restricted, a negative number when the real total
         *         is greater than {@link Long#MAX_VALUE}.
         * @throws NullPointerException
         *             if the directory is {@code null}
         */
        public static long sizeOfDirectory(File directory) {
            checkDirectory(directory);
    
            final File[] files = directory.listFiles();
            if (files == null) { // null if security restricted
                return 0L;
            }
            long size = 0;
    
            for (final File file : files) {
    
                size += sizeOf(file);
                if (size < 0) {
                    break;
    
                }
    
            }
    
            return size;
        }
    
        /**
         * Checks that the given {@code File} exists and is a directory.
         *
         * @param directory
         *            The {@code File} to check.
         * @throws IllegalArgumentException
         *             if the given {@code File} does not exist or is not a
         *             directory.
         */
        private static void checkDirectory(File directory) {
            if (!directory.exists()) {
                throw new IllegalArgumentException(directory + " does not exist");
            }
            if (!directory.isDirectory()) {
                throw new IllegalArgumentException(directory
                        + " is not a directory");
            }
        }
    
    }
    FileUtils.java

    参考资料

      File类官方文档:

      http://docs.oracle.com/javase/7/docs/api/java/io/File.html

      org.apache.commons.io.FileUtils源码:

      http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/2.4/org/apache/commons/io/FileUtils.java

     

      本博客旧博文:

      Java IO File类

      Java IO 用递归实现目录删除和树形目录展示 Java实现

     

  • 相关阅读:
    关于自发电的一些想法
    折腾了一个晚上的业余时间,终于把一块廉价的tftlcd连到了我的树莓派上
    关于飞行器从外太空返回地球时候的减速器的思考与假象
    echart漏斗图背景多出一个方框的问题解决,浪费了两个小时的教训
    linux加密文件系统 fsck 无法修复一例
    天津
    [转]Bitmap图片缩放
    python spark 配置
    screen
    tar 命令
  • 原文地址:https://www.cnblogs.com/mengdd/p/3719212.html
Copyright © 2011-2022 走看看