/** * Copyright (c) 2009--2010 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.rhn.common.util; import org.apache.commons.collections.buffer.CircularFifoBuffer; import org.apache.commons.io.LineIterator; import org.apache.log4j.Logger; import org.jfree.io.IOUtils; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.io.Writer; /** * Simple file utilities to read/write strings to a file on disk. * *@version $Rev$ */ public class FileUtils { private static Logger log = Logger.getLogger(FileUtils.class); private FileUtils() { } /** * Save a String to a file on disk using specified path. * * WARNING: This deletes the original file before it writes. * * @param contents to save to file on disk * @param path to save file to. */ public static void writeStringToFile(String contents, String path) { try { File file = new File(path); if (file.exists()) { file.delete(); } file.createNewFile(); Writer output = new BufferedWriter(new FileWriter(file)); try { output.write(contents); } finally { output.close(); } } catch (Exception e) { log.error("Error trying to write file to disk: [" + path + "]", e); throw new RuntimeException(e); } } /** * Read a file off disk into a String and return it. * * Expect weird stuff if the file is not textual. * * @param path of file to read in * @return String containing file. */ public static String readStringFromFile(String path) { log.debug("readStringFromFile: " + path); File f = new File(path); BufferedReader input; try { input = new BufferedReader(new FileReader(f)); StringWriter writer = new StringWriter(); IOUtils.getInstance().copyWriter(input, writer); String contents = writer.toString(); if (log.isDebugEnabled()) { log.debug("contents: " + contents); } return contents; } catch (FileNotFoundException e) { throw new RuntimeException("File not found: " + path); } catch (IOException e) { throw new RuntimeException(e); } } /** * Read a file off disk into a byte array with specified range * * This can use lots of memory if you read a large file * * @param fileToRead File to read part of into byte array * @param start index of read * @param end index of read * @return byte[] array from file. */ public static byte[] readByteArrayFromFile(File fileToRead, long start, long end) { log.debug("readByteArrayFromFile: " + fileToRead.getAbsolutePath() + " start: " + start + " end: " + end); int size = (int) (end - start); log.debug("size of array: " + size); // Create the byte array to hold the data byte[] bytes = new byte[size]; InputStream is = null; try { is = new FileInputStream(fileToRead); // Read in the bytes int offset = 0; int numRead = 0; // Skip ahead is.skip(start); // start reading while (offset < bytes.length && (numRead) >= 0) { numRead = is.read(bytes, offset, bytes.length - offset); offset += numRead; } } catch (FileNotFoundException fnf) { log.error("Could not read from: " + fileToRead.getAbsolutePath()); throw new RuntimeException(fnf); } catch (IOException e) { log.error("Could not read from: " + fileToRead.getAbsolutePath()); throw new RuntimeException(e); } finally { if (is != null) { try { is.close(); } catch (IOException e) { throw new RuntimeException(e); } } } return bytes; } /** * Reads and returns the last n lines from a given file as string. * @param pathToFile path to file * @param lines size of the tail * @return tail of file as string */ public static String getTailOfFile(String pathToFile, Integer lines) { InputStream fileStream = null; CircularFifoBuffer buffer = new CircularFifoBuffer(lines); try { fileStream = new FileInputStream(pathToFile); LineIterator it = org.apache.commons.io.IOUtils.lineIterator(fileStream, (String) null); while (it.hasNext()) { buffer.add(it.nextLine()); } } catch (FileNotFoundException e) { log.error("File not found: " + pathToFile); throw new RuntimeException(e); } catch (IOException e) { log.error("Could not read from: " + pathToFile); throw new RuntimeException(e); } finally { org.apache.commons.io.IOUtils.closeQuietly(fileStream); } // Construct a string from the buffered lines StringBuilder sb = new StringBuilder(); for (Object s : buffer) { sb.append(s); sb.append(System.getProperty("line.separator")); } return sb.toString(); } }