All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fitbur.assertj.util.Files Maven / Gradle / Ivy

There is a newer version: 1.0.0
Show newest version
/**
 * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * Copyright 2012-2016 the original author or authors.
 */
package com.fitbur.assertj.util;

import static java.io.File.separator;
import static java.lang.String.format;
import static java.lang.String.valueOf;
import static com.fitbur.assertj.util.Arrays.isNullOrEmpty;
import static com.fitbur.assertj.util.Strings.append;
import static com.fitbur.assertj.util.Strings.concat;
import static com.fitbur.assertj.util.Strings.quote;
import static com.fitbur.assertj.util.Preconditions.checkNotNull;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import com.fitbur.assertj.api.exception.RuntimeIOException;

/**
 * Utility methods related to files.
 * 
 * @author Yvonne Wang
 * @author Alex Ruiz
 */
public class Files {
  /**
   * Returns the names of the files inside the specified directory.
   * 
   * @param dirName the name of the directory to start the search from.
   * @param recurse if {@code true}, we will look in subdirectories.
   * @return the names of the files inside the specified directory.
   * @throws IllegalArgumentException if the given directory name does not point to an existing directory.
   */
  public static List fileNamesIn(String dirName, boolean recurse) {
    File dir = new File(dirName);
    if (!dir.isDirectory()) {
      throw new IllegalArgumentException(format("%s is not a directory", quote(dirName)));
    }
    return fileNamesIn(dir, recurse);
  }

  /**
   * Returns the names of the files inside the specified directory.
   * 
   * @param dir the name of the directory to start the search from.
   * @param recurse if {@code true}, we will look in subdirectories.
   * @return the names of the files inside the specified directory.
   */
  private static List fileNamesIn(File dir, boolean recurse) {
    List scriptNames = new ArrayList<>();
    File[] existingFiles = dir.listFiles();
    if (isNullOrEmpty(existingFiles)) {
      return scriptNames;
    }
    for (File existingFile : existingFiles) {
      if (existingFile.isDirectory()) {
        if (recurse) {
          scriptNames.addAll(fileNamesIn(existingFile, recurse));
        }
        continue;
      }
      String filename = existingFile.getAbsolutePath();
      if (!scriptNames.contains(filename)) {
        scriptNames.add(filename);
      }
    }
    return scriptNames;
  }

  /**
   * Returns the system's temporary directory.
   * 
   * @return the system's temporary directory.
   * @throws RuntimeIOException if this method cannot find or create the system's temporary directory.
   */
  public static File temporaryFolder() {
    File temp = new File(temporaryFolderPath());
    if (!temp.isDirectory()) {
      throw new RuntimeIOException("Unable to find temporary directory");
    }
    return temp;
  }

  /**
   * Returns the path of the system's temporary directory. This method appends the system's file separator at the end of
   * the path.
   * 
   * @return the path of the system's temporary directory.
   */
  public static String temporaryFolderPath() {
    return append(separator).to(System.getProperty("java.io.tmpdir"));
  }

  /**
   * Creates a new file in the system's temporary directory. The name of the file will be the result of:
   * 
 concat(String.valueOf(System.currentTimeMillis()), ".txt");
* * @return the created file. */ public static File newTemporaryFile() { String tempFileName = concat(valueOf(System.currentTimeMillis()), ".txt"); return newFile(concat(temporaryFolderPath(), tempFileName)); } /** * Creates a new directory in the system's temporary directory. The name of the directory will be the result of: *
 System.currentTimeMillis();
* * @return the created file. */ public static File newTemporaryFolder() { String tempFileName = String.valueOf(System.currentTimeMillis()); return newFolder(concat(temporaryFolderPath(), tempFileName)); } /** * Creates a new file using the given path. * * @param path the path of the new file. * @return the new created file. * @throws RuntimeIOException if the path belongs to an existing non-empty directory. * @throws RuntimeIOException if the path belongs to an existing file. * @throws RuntimeIOException if any I/O error is thrown when creating the new file. */ public static File newFile(String path) { File file = createFileIfPathIsNotANonEmptyDirectory(path); try { if (!file.createNewFile()) { throw cannotCreateNewFile(path, "a file was found with the same path"); } } catch (IOException e) { throw cannotCreateNewFile(path, e); } return file; } /** * Creates a new directory using the given path. * * @param path the path of the new directory. * @return the new created directory. * @throws RuntimeIOException if the path belongs to an existing non-empty directory. * @throws RuntimeIOException if the path belongs to an existing file. * @throws RuntimeIOException if any I/O error is thrown when creating the new directory. */ public static File newFolder(String path) { File file = createFileIfPathIsNotANonEmptyDirectory(path); try { if (!file.mkdir()) { throw cannotCreateNewFile(path, "a file was found with the same path"); } } catch (Exception e) { throw cannotCreateNewFile(path, e); } return file; } private static File createFileIfPathIsNotANonEmptyDirectory(String path) { File file = new File(path); if (file.isDirectory() && !isNullOrEmpty(file.list())) { throw cannotCreateNewFile(path, "a non-empty directory was found with the same path"); } return file; } private static RuntimeIOException cannotCreateNewFile(String path, String reason) { throw cannotCreateNewFile(path, reason, null); } private static RuntimeIOException cannotCreateNewFile(String path, Exception cause) { throw cannotCreateNewFile(path, null, cause); } private static RuntimeIOException cannotCreateNewFile(String path, String reason, Exception cause) { String message = String.format("Unable to create the new file %s", quote(path)); if (!Strings.isNullOrEmpty(reason)) { message = concat(message, ": ", reason); } if (cause != null) { throw new RuntimeIOException(message, cause); } throw new RuntimeIOException(message); } /** * Returns the current directory. * * @return the current directory. * @throws RuntimeIOException if the current directory cannot be obtained. */ public static File currentFolder() { try { return new File(".").getCanonicalFile(); } catch (IOException e) { throw new RuntimeIOException("Unable to get current directory", e); } } /** * Deletes the given file or directory. * * @param file the file or directory to delete. */ public static void delete(File file) { if (file.isFile()) { file.delete(); return; } if (!file.isDirectory()) { return; } File[] existingFiles = file.listFiles(); if (!isNullOrEmpty(existingFiles)) { for (File f : existingFiles) { delete(f); } } file.delete(); } /** * Loads the text content of a file into a character string. * * @param file the file. * @param charsetName the name of the character set to use. * @return the content of the file. * @throws IllegalArgumentException if the given character set is not supported on this platform. * @throws RuntimeIOException if an I/O exception occurs. */ public static String contentOf(File file, String charsetName) { if (!Charset.isSupported(charsetName)) { throw new IllegalArgumentException(String.format("Charset:<'%s'> is not supported on this system", charsetName)); } return contentOf(file, Charset.forName(charsetName)); } /** * Loads the text content of a file into a character string. * * @param file the file. * @param charset the character set to use. * @return the content of the file. * @throws NullPointerException if the given charset is {@code null}. * @throws RuntimeIOException if an I/O exception occurs. */ public static String contentOf(File file, Charset charset) { checkNotNull(charset, "The charset should not be null"); try { return loadContents(file, charset); } catch (IOException e) { throw new RuntimeIOException("Unable to read " + file.getAbsolutePath(), e); } } private static String loadContents(File file, Charset charset) throws IOException { BufferedReader reader = null; boolean threw = true; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset)); StringWriter writer = new StringWriter(); int c; while ((c = reader.read()) != -1) { writer.write(c); } threw = false; return writer.toString(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { if (!threw) { throw e; // if there was an initial exception, don't hide it } } } } } /** * Loads the text content of a file into a list of strings, each string corresponding to a line. The line endings are * either \n, \r or \r\n. * * @param file the file. * @param charset the character set to use. * @return the content of the file. * @throws NullPointerException if the given charset is {@code null}. * @throws RuntimeIOException if an I/O exception occurs. */ public static List linesOf(File file, Charset charset) { checkNotNull(charset, "The charset should not be null"); try { return loadLines(file, charset); } catch (IOException e) { throw new RuntimeIOException("Unable to read " + file.getAbsolutePath(), e); } } /** * Loads the text content of a file into a list of strings, each string corresponding to a line. The line endings are * either \n, \r or \r\n. * * @param file the file. * @param charsetName the name of the character set to use. * @return the content of the file. * @throws NullPointerException if the given charset is {@code null}. * @throws RuntimeIOException if an I/O exception occurs. */ public static List linesOf(File file, String charsetName) { if (!Charset.isSupported(charsetName)) { throw new IllegalArgumentException(String.format("Charset:<'%s'> is not supported on this system", charsetName)); } return linesOf(file, Charset.forName(charsetName)); } private static List loadLines(File file, Charset charset) throws IOException { BufferedReader reader = null; boolean threw = true; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset)); List strings = Lists.newArrayList(); String line = reader.readLine(); while (line != null) { strings.add(line); line = reader.readLine(); } threw = false; return strings; } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { if (!threw) { throw e; // if there was an initial exception, don't hide it } } } } } private Files() { } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy