package jas.common.helper; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.nio.channels.FileChannel; import com.google.common.base.Optional; public class FileUtilities { public static final void copy(File source, File destination) { if (source.isDirectory()) { copyDirectory(source, destination); } else { copyFile(source, destination); } } public static final void copyDirectory(File source, File destination) { if (!source.isDirectory()) { throw new IllegalArgumentException("Source (" + source.getPath() + ") must be a directory."); } if (!source.exists()) { throw new IllegalArgumentException("Source directory (" + source.getPath() + ") doesn't exist."); } if (destination.exists()) { throw new IllegalArgumentException("Destination (" + destination.getPath() + ") exists."); } destination.mkdirs(); File[] files = source.listFiles(); for (File file : files) { copy(file, new File(destination, file.getName())); } } public static final void copyFile(File source, File destination) { FileChannel sourceChannel = null; FileChannel targetChannel = null; try { sourceChannel = new FileInputStream(source).getChannel(); targetChannel = new FileOutputStream(destination).getChannel(); sourceChannel.transferTo(0, sourceChannel.size(), targetChannel); } catch (IOException e) { e.printStackTrace(); } finally { try { if (sourceChannel != null) { sourceChannel.close(); } if (targetChannel != null) { targetChannel.close(); } } catch (IOException e2) { e2.printStackTrace(); } } } public static OptionalCloseable<FileWriter> createWriter(File file, boolean createIfAbsent) { try { if (createIfAbsent && !file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } if (file.exists()) { return OptionalCloseable.of(new FileWriter(file)); } } catch (IOException e) { e.printStackTrace(); } return OptionalCloseable.absent(); } public static OptionalCloseable<FileReaderPlus> createReader(File file, boolean createIfAbsent) { try { if (createIfAbsent && !file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } if (file.exists()) { return OptionalCloseable.of(new FileReaderPlus(file)); } } catch (IOException e) { e.printStackTrace(); } return OptionalCloseable.absent(); } public static class OptionalCloseable<T extends Closeable> { private Optional<T> object; private OptionalCloseable() { object = Optional.absent(); } private OptionalCloseable(T value) { object = Optional.of(value); } public boolean isPresent() { return object.isPresent(); } public T get() { return object.get(); } public void close() { if (object.isPresent()) { try { object.get().close(); } catch (IOException e) { e.printStackTrace(); } } } public static <T extends Closeable> OptionalCloseable<T> absent() { return new OptionalCloseable<T>(); } public static <T extends Closeable> OptionalCloseable<T> of(T value) { return new OptionalCloseable<T>(value); } } /** * FileWriter that provides access to the underlying File object */ public static class FileReaderPlus extends FileReader { public final File file; public FileReaderPlus(File file) throws FileNotFoundException { super(file); this.file = file; } } public static File[] getFileInDirectory(File directory, final String suffix) { if (!directory.exists()) { return new File[0]; } directory.mkdirs(); return directory.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String filename) { return filename.endsWith(suffix); } }); } }