Mega Code Archive

 
Categories / Java / File Input Output
 

Utility methods for handling files and directories

//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 <b>installationDirectory </b>.    * @return <b>true </b> 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, <b>false </b> is always returned.    *     * @param dir    *            a File representing the directory to be delete    * @return <b>true </b> if and only if the directory does not exist on    *         termination; a return value <b>false </b> does not imply that    *         there were no files deleted    * @throws IllegalArgumentException    *             if the parameter is <b>null </b>    */   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 <b>true </b> 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    *            <code>path</code> begins with "#" it is resolved against the    *            program's standard resource folder after removing "#"    * @return an InputStream to read the resource data, or <b>null </b> 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    *            <code>path</code> begins with "#" it is resolved against the    *            program's standard resource folder after removing "#"    * @return an URL instance, or <b>null </b> 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 <b>true </b> if and only if the operation was successful,    *         <b>false </b> 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    * <code>copyResource ( String resource, new File (outputFile) )</code>.    */   public static boolean copyResource(String resource, String outputFile)       throws java.io.IOException {     return copyResource(resource, new File(outputFile));   } }