File Input Output Java

//The contents of this file are subject to the Mozilla Public License Version 1.1
//(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.mozilla.org/MPL/
//
//Software distributed under the License is distributed on an "AS IS" basis,
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
//for the specific language governing rights and
//limitations under the License.
//
//The Original Code is "The Columba Project"
//
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
//
//All Rights Reserved.
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.logging.Logger;
/**
 * Utility methods for handling files and directories.
 */
public final class DiskIO {
  private static final Logger LOG = Logger.getLogger("org.columba.core.io");
  private static String resourceFolder = "";
  /**
   * Private constructor for utility class.
   */
  private DiskIO() {
    // don't instantiate this
  }
  /**
   * Ensures the existence of the directory specified by the parameter. If the
   * directory does not exist, an attempt is performed to create it including
   * all necessary parent directories that may be implied by the
   * specification. ### HELPME : against what should a relative pathname be
   * made absolute? ### ### We need to set the installation directory
   * somewhere! ####
   * 
   * @param dir
   *            File specifying the intended directory name; if the specified
   *            name is a relative path, it is always made absolute against
   *            the program's installationDirectory .
   * @return true  if and only if the specified file exists and is a
   *         directory
   */
  public static boolean ensureDirectory(File dir) {
    if (dir == null) {
      throw new IllegalArgumentException("dir = null");
    }
    boolean success = true;
    if (!dir.isDirectory()) {
      success = !dir.isFile() && dir.mkdirs();
      if (success) {
        LOG.info("Created directory: " + dir.toString());
      } else {
        LOG.severe("failed while trying to create directory: "
            + dir.toString());
      }
    }
    return success;
  }
  // ensureDirectory
  public static boolean ensureDirectory(String path) {
    return ensureDirectory(new File(path));
  }
  public static void saveStringInFile(File toFile, String insertString)
      throws IOException {
    BufferedWriter out;
    out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
        toFile), "ISO-8859-1"));
    out.write(insertString);
    out.flush();
    out.close();
  }
  // saveStringInFile
  public static String readFileInString(File fromFile) throws IOException {
    StringBuffer strbuf = new StringBuffer((int) fromFile.length());
    BufferedReader in = new BufferedReader(new InputStreamReader(
        new FileInputStream(fromFile), "ISO-8859-1"));
    String str;
    strbuf = new StringBuffer((int) fromFile.length());
    while ((str = in.readLine()) != null) {
      strbuf.append(str + "\n");
    }
    in.close();
    return strbuf.toString();
    /*
     * int lineNumber = 0; byte[] buffer = new byte[1024]; int read;
     * StringBuffer out = new StringBuffer((int)fromFile.length());
     * FileInputStream in = new FileInputStream( fromFile );
     * 
     * read = in.read(buffer); while ( read == 1024 ) { out.append(new
     * String(buffer,"ISO-8859-1")); read = in.read(buffer); }
     * 
     * out.append(new String(buffer,0,read,"ISO-8859-1")); in.close();
     * 
     * return out.toString();
     */
  }
  // saveStringInFile
  /**
   * Deletes the directory specified by the parameter and all of its contents.
   * This does recurse into subdirectories. Function reports errors. If the
   * parameter does not denote a directory, false  is always returned.
   * 
   * @param dir
   *            a File representing the directory to be delete
   * @return true  if and only if the directory does not exist on
   *         termination; a return value false  does not imply that
   *         there were no files deleted
   * @throws IllegalArgumentException
   *             if the parameter is null 
   */
  public static boolean deleteDirectory(File dir) {
    File[] files;
    File f;
    int i;
    boolean success = true;
    if (dir == null) {
      throw new IllegalArgumentException("dir = null");
    }
    if (!dir.isDirectory()) {
      return false;
    }
    files = dir.listFiles();
    for (i = 0; i < files.length; i++) {
      if ((f = files[i]).isDirectory()) {
        deleteDirectory(f);
      } else if (!f.delete()) {
        LOG.severe("*** failed to delete file " + f.getAbsolutePath());
      }
    }
    success = dir.delete();
    if (!success) {
      LOG.severe("*** failed to delete directory "
          + dir.getAbsolutePath());
    }
    return success;
  }
  // deleteDirectory
  /**
   * Deletes the contents of an existing directory. (May be applied to
   * non-existing files without causing error.)
   * 
   * @return true  if and only if on termination the directory exists
   *         and is empty
   */
  public static boolean emptyDirectory(File dir) {
    boolean success;
    if (dir == null) {
      throw new IllegalArgumentException("dir = null");
    }
    if ((success = dir.exists() && deleteDirectory(dir))) {
      dir.mkdirs();
    }
    return success && dir.exists();
  }
  // emptyDirectory
  /**
   * General use columba resource InputStream getter.
   * 
   * @param path
   *            the full path and filename of the resource requested. If
   *            path begins with "#" it is resolved against the
   *            program's standard resource folder after removing "#"
   * @return an InputStream to read the resource data, or null  if the
   *         resource could not be obtained
   * @throws java.io.IOException
   *             if there was an error opening the input stream
   */
  public static InputStream getResourceStream(String path)
      throws java.io.IOException {
    URL url;
    if ((url = getResourceURL(path)) == null) {
      return null;
    }
    return url.openStream();
  }
  // getResourceStream
  /**
   * General use columba resource URL getter.
   * 
   * @param path
   *            the full path and filename of the resource requested. If
   *            path begins with "#" it is resolved against the
   *            program's standard resource folder after removing "#"
   * @return an URL instance, or null  if the resource could not be
   *         obtained
   * @throws java.io.IOException
   *             if there was an error opening the input stream
   */
  public static URL getResourceURL(String path) // throws
  // java.io.IOException
  {
    URL url;
    if (path == null) {
      throw new IllegalArgumentException("path = null");
    }
    if (path.startsWith("#")) {
      path = resourceFolder + path.substring(1);
    }
    // url = ClassLoader.getSystemResource(path);
    url = DiskIO.class.getResource("/" + path);
    if (url == null) {
      LOG.info("*** failed locating resource: " + path);
      return null;
    }
    return url;
  }
  // getResourceURL
  public static void setResourceRoot(String path) {
    if (path == null) {
      resourceFolder = "";
    } else {
      if (!path.endsWith("/")) {
        path += "/";
      }
      resourceFolder = path;
    }
  }
  // setResourceRoot
  public static String getResourceRoot() {
    return resourceFolder;
  }
  /**
   * Copies the contents of any disk file to the specified output file. The
   * output file will be overridden if it exist. Function reports errors.
   * 
   * @param inputFile
   *            a File object
   * @param outputFile
   *            a File object
   * @throws java.io.IOException
   *             if the function could not be completed because of an IO error
   */
  public static void copyFile(File inputFile, File outputFile)
      throws java.io.IOException {
    FileInputStream in;
    FileOutputStream out;
    byte[] buffer = new byte[512];
    int len;
    try {
      out = new FileOutputStream(outputFile);
      in = new FileInputStream(inputFile);
      while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
      }
      in.close();
      out.close();
    } catch (IOException e) {
      LOG.info("*** error during file copy "
          + outputFile.getAbsolutePath() + ": " + e.getMessage());
      throw e;
    }
  }
  // copyFile
  /**
   * Copies a system resource to the specified output file. The output file
   * will be overridden if it exist, so the calling routine has to take care
   * about unwanted deletions of content. Function reports errors.
   * 
   * @param resource
   *            a full resource path. If the value begins with "#", it is
   *            resolved against the program's standard resource folder after
   *            removing "#"
   * @return true  if and only if the operation was successful,
   *         false  if the resource was not found
   * @throws java.io.IOException
   *             if there was an IO error
   */
  public static boolean copyResource(String resource, File outputFile)
      throws java.io.IOException {
    InputStream in;
    FileOutputStream out;
    byte[] buffer = new byte[512];
    int len;
    // attempt
    try {
      if ((in = DiskIO.getResourceStream(resource)) == null) {
        return false;
      }
      out = new FileOutputStream(outputFile);
      while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
      }
      out.close();
      in.close();
      LOG.fine("created : " + outputFile.getAbsolutePath());
    } catch (IOException e) {
      LOG.severe("*** error during resource file copy "
          + outputFile.getAbsolutePath() + ": " + e.getMessage());
      throw e;
    }
    return true;
  }
  // copyResource
  public static String readStringFromResource(String resource)
      throws java.io.IOException {
    InputStream in;
    StringBuffer result = new StringBuffer();
    // attempt
    try {
      if ((in = DiskIO.getResourceStream(resource)) == null) {
        return "";
      }
      BufferedReader reader = new BufferedReader(
          new InputStreamReader(in));
      String nextLine = reader.readLine();
      while (nextLine != null) {
        result.append(nextLine);
        result.append("\n");
        nextLine = reader.readLine();
      }
      in.close();
    } catch (IOException e) {
      e.printStackTrace();
      throw e;
    }
    return result.toString();
  }
  /**
   * Results equal
   * copyResource ( String resource, new File (outputFile) ).
   */
  public static boolean copyResource(String resource, String outputFile)
      throws java.io.IOException {
    return copyResource(resource, new File(outputFile));
  }
}