File Input Output Java

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

   * 

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

   * 

   * If the first parameter is a file and the second is a directory, the file is
   * copied to the directory, overwriting any existing copy. 

   * 

   * If the first parameter is a directory and the second is a directory, the
   * first is copied underneath the second. 

   * 

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

       *           
  • If the source does not exist.

  •    *           
  • If the user does not have permission to modify the
       *           destination.

  •    *           
  • If the copy fails for some reason related to system I/O.

  •    *           

   * 
   */
  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();
  }
}