集册 Java实例教程 将文件移动到目录。

将文件移动到目录。

欢马劈雪     最近更新时间:2020-01-02 10:19:05

573
将文件移动到目录。

/*

 * 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.

 */

import java.io.Closeable;/**来自 nowjava.com**/

import java.io.File;

import java.io.FileFilter;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.nio.channels.FileChannel;

import java.util.ArrayList;

import java.util.List;


public class Main{

    public static void main(String[] argv) throws Exception{

        File srcFile = new File("Main.java");/** from n o w j a v a . c o m - 时  代  Java**/

        File destDir = new File("Main.java");

        boolean createDestDir = true;

        moveFileToDirectory(srcFile,destDir,createDestDir);

    }

    /**

     * The file copy buffer size (30 MB)

     */

    private static final long FILE_COPY_BUFFER_SIZE = ONE_MB * 30;

    /**

     * Moves a file to a directory.

     *

     * @param srcFile the file to be moved

     * @param destDir the destination file

     * @param createDestDir If <code>true</code> create the destination directory,

     * otherwise if <code>false</code> throw an IOException

     * @throws NullPointerException if source or destination is <code>null</code>

     * @throws FileExistsException if the destination file exists

     * @throws IOException if source or destination is invalid

     * @throws IOException if an IO error occurs moving the file

     * @since Commons IO 1.4

     */

    private static void moveFileToDirectory(File srcFile, File destDir,

            boolean createDestDir) throws IOException {

        if (srcFile == null) {

            throw new NullPointerException("Source must not be null");

        }

        if (destDir == null) {

            throw new NullPointerException(

                    "Destination directory must not be null");

        }

        if (!destDir.exists() && createDestDir) {

            destDir.mkdirs();

        }

        if (!destDir.exists()) {

            throw new FileNotFoundException("Destination directory '"

                    + destDir + "' does not exist [createDestDir="

                    + createDestDir + "]");

        }

        if (!destDir.isDirectory()) {

            throw new IOException("Destination '" + destDir

                    + "' is not a directory");

        }

        moveFile(srcFile, new File(destDir, srcFile.getName()));

    }

    /**

     * Moves a file.

     * <p>

     * When the destination file is on another file system, do a "copy and delete".

     *

     * @param srcFile the file to be moved

     * @param destFile the destination file

     * @throws NullPointerException if source or destination is <code>null</code>

     * @throws FileExistsException if the destination file exists

     * @throws IOException if source or destination is invalid

     * @throws IOException if an IO error occurs moving the file

     * @since Commons IO 1.4

     */

    public static void moveFile(File srcFile, File destFile)

            throws IOException {

        if (srcFile == null) {

            throw new NullPointerException("Source must not be null");

        }

        if (destFile == null) {

            throw new NullPointerException("Destination must not be null");

        }

        if (!srcFile.exists()) {

            throw new FileNotFoundException("Source '" + srcFile

                    + "' does not exist");

        }

        if (srcFile.isDirectory()) {

            throw new IOException("Source '" + srcFile + "' is a directory");

        }

        if (destFile.exists()) {

            throw new IOException("Destination '" + destFile

                    + "' already exists");

        }

        if (destFile.isDirectory()) {

            throw new IOException("Destination '" + destFile

                    + "' is a directory");

        }

        boolean rename = srcFile.renameTo(destFile);

        if (!rename) {

            copyFile(srcFile, destFile);

            if (!srcFile.delete()) {

                CommonsFileUtils.deleteQuietly(destFile);

                throw new IOException("Failed to delete original file '"

                        + srcFile + "' after copy to '" + destFile + "'");

            }

        }

    }

    /**

     * Copies a file to a new location preserving the file date.

     * <p>

     * This method copies the contents of the specified source file to the

     * specified destination file. The directory holding the destination file is

     * created if it does not exist. If the destination file exists, then this

     * method will overwrite it.

     * <p>

     * <strong>Note:</strong> This method tries to preserve the file's last

     * modified date/times using {@link File#setLastModified(long)}, however

     * it is not guaranteed that the operation will succeed.

     * If the modification operation fails, no indication is provided.

     * 

     * @param srcFile  an existing file to copy, must not be <code>null</code>

     * @param destFile  the new file, must not be <code>null</code>

     * 

     * @throws NullPointerException if source or destination is <code>null</code>

     * @throws IOException if source or destination is invalid

     * @throws IOException if an IO error occurs during copying

     * @see #copyFileToDirectory(File, File)

     */

    public static void copyFile(File srcFile, File destFile)

            throws IOException {

        copyFile(srcFile, destFile, true);

    }

    /**

     * Copies a file to a new location.

     * <p>

     * This method copies the contents of the specified source file

     * to the specified destination file.

     * The directory holding the destination file is created if it does not exist.

     * If the destination file exists, then this method will overwrite it.

     * <p>

     * <strong>Note:</strong> Setting <code>preserveFileDate</code> to

     * <code>true</code> tries to preserve the file's last modified

     * date/times using {@link File#setLastModified(long)}, however it is

     * not guaranteed that the operation will succeed.

     * If the modification operation fails, no indication is provided.

     *

     * @param srcFile  an existing file to copy, must not be <code>null</code>

     * @param destFile  the new file, must not be <code>null</code>

     * @param preserveFileDate  true if the file date of the copy

     *  should be the same as the original

     *

     * @throws NullPointerException if source or destination is <code>null</code>

     * @throws IOException if source or destination is invalid

     * @throws IOException if an IO error occurs during copying

     * @see #copyFileToDirectory(File, File, boolean)

     */

    private static void copyFile(File srcFile, File destFile,

            boolean preserveFileDate) throws IOException {

        if (srcFile == null) {

            throw new NullPointerException("Source must not be null");

        }

        if (destFile == null) {

            throw new NullPointerException("Destination must not be null");

        }

        if (srcFile.exists() == false) {

            throw new FileNotFoundException("Source '" + srcFile

                    + "' does not exist");

        }

        if (srcFile.isDirectory()) {

            throw new IOException("Source '" + srcFile

                    + "' exists but is a directory");

        }

        if (srcFile.getCanonicalPath().equals(destFile.getCanonicalPath())) {

            throw new IOException("Source '" + srcFile

                    + "' and destination '" + destFile + "' are the same");

        }

        File parentFile = destFile.getParentFile();

        if (parentFile != null) {

            if (!parentFile.mkdirs() && !parentFile.isDirectory()) {

                throw new IOException("Destination '" + parentFile

                        + "' directory cannot be created");

            }

        }

        if (destFile.exists() && destFile.canWrite() == false) {

            throw new IOException("Destination '" + destFile

                    + "' exists but is read-only");

        }

        doCopyFile(srcFile, destFile, preserveFileDate);

    }

    /**

     * 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</code>

     * @return <code>true</code> if the file or directory was deleted, otherwise

     * <code>false</code>

     *

     * @since Commons IO 1.4

     */

    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;

        }

    }

    /**

     * Internal copy file method.

     * 

     * @param srcFile  the validated source file, must not be <code>null</code>

     * @param destFile  the validated destination file, must not be <code>null</code>

     * @param preserveFileDate  whether to preserve the file date

     * @throws IOException if an error occurs

     */

    private static void doCopyFile(File srcFile, File destFile,

            boolean preserveFileDate) throws IOException {

        if (destFile.exists() && destFile.isDirectory()) {

            throw new IOException("Destination '" + destFile

                    + "' exists but is a directory");

        }


        FileInputStream fis = null;

        FileOutputStream fos = null;

        FileChannel input = null;

        FileChannel output = null;

        try {

            fis = new FileInputStream(srcFile);

            fos = new FileOutputStream(destFile);

            input = fis.getChannel();

            output = fos.getChannel();

            long size
展开阅读全文