001    /*
002    Galois, a framework to exploit amorphous data-parallelism in irregular
003    programs.
004    
005    Copyright (C) 2010, The University of Texas at Austin. All rights reserved.
006    UNIVERSITY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES CONCERNING THIS SOFTWARE
007    AND DOCUMENTATION, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR ANY
008    PARTICULAR PURPOSE, NON-INFRINGEMENT AND WARRANTIES OF PERFORMANCE, AND ANY
009    WARRANTY THAT MIGHT OTHERWISE ARISE FROM COURSE OF DEALING OR USAGE OF TRADE.
010    NO WARRANTY IS EITHER EXPRESS OR IMPLIED WITH RESPECT TO THE USE OF THE
011    SOFTWARE OR DOCUMENTATION. Under no circumstances shall University be liable
012    for incidental, special, indirect, direct or consequential damages or loss of
013    profits, interruption of business, or related expenses which may arise from use
014    of Software or Documentation, including but not limited to those resulting from
015    defects in Software and/or Documentation, or loss or inaccuracy of data of any
016    kind.
017    
018    File: InputOutput.java 
019    
020    */
021    
022    
023    
024    package util;
025    
026    import java.io.BufferedWriter;
027    import java.io.File;
028    import java.io.FileWriter;
029    import java.io.FilenameFilter;
030    import java.io.IOException;
031    import java.util.Arrays;
032    import java.util.Collection;
033    import java.util.Collections;
034    import java.util.List;
035    
036    /**
037     * Helper methods related to the filesystem, but not included in 
038     * {@link java.nio} or {@link java.io}
039     */
040    
041    public final class InputOutput {
042    
043      /**
044       * File separator, OS-dependent
045       */
046      public static final String FILE_SEPARATOR = System.getProperty("file.separator");
047      /**
048       * Line separator, OS-dependent
049       */
050      public static final String LINE_SEPARATOR = System.getProperty("line.separator");
051    
052      /**
053       * Returns a list containing the absolute path of every file that is contained
054       * in the given directory and matches the given regular expression.
055       *
056       * @param directory absolute path representing a directory
057       * @param suffix    regular expression
058       * @return  full paths of all files matching the given criteria
059       */
060      public static Collection<String> getFilePathsMatching(String directory, final String suffix) {
061        FilenameFilter filter = new FilenameFilter() {
062          public boolean accept(File dir, String name) {
063            return name.matches(suffix);
064          }
065        };
066        return getFilePaths(directory, filter);
067      }
068    
069      /**
070       * Returns a list containing the absolute path of every file that is contained
071       * in the given directory and has the given suffix
072       *
073       * @param directory absolute path representing a directory.
074       * @param suffix    suffix we are looking for.
075       * @return  full paths of all files matching the given criteria.
076       */
077      public static Collection<String> getFilePathsEndingWith(String directory, final String suffix) {
078        FilenameFilter filter = new FilenameFilter() {
079          public boolean accept(File dir, String name) {
080            return name.endsWith(suffix);
081          }
082        };
083        return getFilePaths(directory, filter);
084      }
085    
086      /**
087       * Returns a list containing the absolute path of every file that is contained
088       * in the given directory and has the given prefix
089       *
090       * @param directory absolute path representing a directory
091       * @param prefix    prefix we are looking for
092       * @return  full paths of all files matching the given criteria
093       */
094      public static Collection<String> getFilePathsStartingWith(String directory, final String prefix) {
095        FilenameFilter filter = new FilenameFilter() {
096          public boolean accept(File dir, String name) {
097            return name.startsWith(prefix);
098          }
099        };
100        return getFilePaths(directory, filter);
101      }
102    
103      private static Collection<String> getFilePaths(String directory, FilenameFilter filter) {
104        File inputDirectory = new File(directory);
105        String[] children = inputDirectory.list(filter);
106        if (children == null) {
107          throw new RuntimeException("Input directory: " + inputDirectory + " does not exist or is not a directory.");
108        }
109        List<String> result = Arrays.asList(children);
110        Collections.sort(result);
111        for (int i = 0; i < result.size(); i++) {
112          String fullPath = directory + "/" + result.get(i);
113          result.set(i, fullPath);
114        }
115        return result;
116      }
117    
118      /**
119       * Appends the given text into the designated file
120       *
121       * @param filePath full path to a file; if the file does not exist, it is created.
122       * @param text     text to write in the file
123       * @throws IOException  if there is an error while writing or closing the file
124       */
125      public static void write(final String filePath, final String text) throws IOException {
126        write(filePath, text, true);
127      }
128    
129      /**
130       * Write the given text into the designated file.
131       *
132       * @param filePath full path to a file; if the file does not exist, it is created.
133       * @param text     text to write in the file
134       * @param append   whether to append (true) to or overwrite (false) the contents of
135       *                 the file
136       * @throws IOException if there is an error while writing or closing the file
137       */
138      public static void write(final String filePath, final String text, boolean append) throws IOException {
139        BufferedWriter out = new BufferedWriter(new FileWriter(filePath, append));
140        out.write(text);
141        out.close();
142      }
143    }