/*
* 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.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;
/**
*
* FileUtils is a collection of routines for common file system operations.
*
* @author Dan Jemiolo (danj)
*
*/
public final class FileUtils {
/**
*
* The application's current working directory.
*
*/
public static final File CURRENT_DIR = new File(".");
/**
*
* Copies the first file or directory to the second file or directory. <br>
* <br>
* If the first parameter is a file and the second is a file, then the method
* copies the contents of the first file into the second. If the second file
* does not exist, it is created. <br>
* <br>
* If the first parameter is a file and the second is a directory, the file is
* copied to the directory, overwriting any existing copy. <br>
* <br>
* If the first parameter is a directory and the second is a directory, the
* first is copied underneath the second. <br>
* <br>
* If the first parameter is a directory and the second is a file name or does
* not exist, a directory with that name is created, and the contents of the
* first directory are copied there.
*
* @param source
* @param destination
*
* @throws IOException
* <ul>
* <li>If the source does not exist.</li>
* <li>If the user does not have permission to modify the
* destination.</li>
* <li>If the copy fails for some reason related to system I/O.</li>
* </ul>
*
*/
public static void copy(File source, File destination) throws IOException {
if (source == null)
throw new NullPointerException("NullSource");
if (destination == null)
throw new NullPointerException("NullDestination");
if (source.isDirectory())
copyDirectory(source, destination);
else
copyFile(source, destination);
}
public static void copyDirectory(File source, File destination) throws IOException {
copyDirectory(source, destination, null);
}
public static void copyDirectory(File source, File destination, FileFilter filter)
throws IOException {
File nextDirectory = new File(destination, source.getName());
//
// create the directory if necessary...
//
if (!nextDirectory.exists() && !nextDirectory.mkdirs()) {
Object[] filler = { nextDirectory.getAbsolutePath() };
String message = "DirCopyFailed";
throw new IOException(message);
}
File[] files = source.listFiles();
//
// and then all the items below the directory...
//
for (int n = 0; n < files.length; ++n) {
if (filter == null || filter.accept(files[n])) {
if (files[n].isDirectory())
copyDirectory(files[n], nextDirectory, filter);
else
copyFile(files[n], nextDirectory);
}
}
}
public static void copyFile(File source, File destination) throws IOException {
//
// if the destination is a dir, what we really want to do is create
// a file with the same name in that dir
//
if (destination.isDirectory())
destination = new File(destination, source.getName());
FileInputStream input = new FileInputStream(source);
copyFile(input, destination);
}
public static void copyFile(InputStream input, File destination) throws IOException {
OutputStream output = null;
output = new FileOutputStream(destination);
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer);
while (bytesRead >= 0) {
output.write(buffer, 0, bytesRead);
bytesRead = input.read(buffer);
}
input.close();
output.close();
}
}