package info.ephyra.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringReader; import java.util.ArrayList; /** * A collection of file system related utilities. * * @author Nico Schlaefer * @version 2007-05-05 */ public class FileUtils { /** * Returns the files in the given directory (only normal files, no * subdirectories). * * @param dir a directory * @return files in the directory */ public static File[] getFiles(String dir) { ArrayList<File> files = new ArrayList<File>(); // only return normal files, no subdirectories File[] filesOrDirs = new File(dir).listFiles(); for (File fileOrDir : filesOrDirs) if (fileOrDir.isFile()) files.add(fileOrDir); return files.toArray(new File[files.size()]); } /** * Returns the files in the given directory and its subdirectories. * * @param dir a directory * @return files in the directory and subdirectories */ public static File[] getFilesRec(String dir) { ArrayList<File> files = new ArrayList<File>(); // recursively browse directories getFilesRec(new File(dir), files); return files.toArray(new File[files.size()]); } /** * Recursively browses a directory and its subdirectories for files. * * @param dir a directory */ private static void getFilesRec(File dir, ArrayList<File> files) { File[] filesOrDirs = dir.listFiles(); for (File fileOrDir : filesOrDirs) if (fileOrDir.isFile()) files.add(fileOrDir); // add normal files else getFilesRec(fileOrDir, files); // browse subdirectories } /** * Returns the subdirectories of the given directory. * * @param dir a directory * @return subdirectories */ public static String[] getSubDirs(String dir) { ArrayList<String> subDirs = new ArrayList<String>(); // only return subdirectories, no normal files File[] filesOrDirs = new File(dir).listFiles(); for (File fileOrDir : filesOrDirs) if (fileOrDir.isDirectory()) subDirs.add(fileOrDir.getName()); return subDirs.toArray(new String[subDirs.size()]); } /** * Returns the visible subdirectories of the given directory. * * @param dir a directory * @return visible subdirectories */ public static String[] getVisibleSubDirs(String dir) { String[] subDirs = getSubDirs(dir); ArrayList<String> visible = new ArrayList<String>(); for (String subDir : subDirs) if (!subDir.startsWith(".")) visible.add(subDir); return visible.toArray(new String[visible.size()]); } /** * Reads a string from a file, using the given encoding. * * @param input input file * @param encoding file encoding * @return string */ public static String readString(File input, String encoding) throws IOException { StringBuffer buffer = new StringBuffer(); FileInputStream fis = new FileInputStream(input); BufferedReader reader = new BufferedReader(new InputStreamReader(fis, encoding)); for (String nextLine; (nextLine = reader.readLine()) != null;) buffer.append(nextLine + "\n"); reader.close(); return buffer.toString(); } /** * Writes a string to a file, using the given encoding. An existing file is * overwritten. * * @param s string * @param output output file * @param encoding file encoding */ public static void writeString(String s, File output, String encoding) throws IOException { BufferedReader buffer = new BufferedReader(new StringReader(s)); FileOutputStream fos = new FileOutputStream(output); PrintWriter writer = new PrintWriter(new OutputStreamWriter(fos, encoding)); for (String nextLine; (nextLine = buffer.readLine()) != null;) writer.println(nextLine); writer.close(); buffer.close(); } /** * Reads a serialized object from a file. * * @param input input file * @return object */ public static Object readSerialized(File input) throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis); Object o = ois.readObject(); ois.close(); return o; } /** * Writes a serialized object to a file. * * @param o object * @param output output file */ public static void writeSerialized(Object o, File output) throws IOException { FileOutputStream fos = new FileOutputStream(output); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(o); oos.close(); } }