com.norconex.commons.lang.io.FileUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of norconex-commons-lang Show documentation
Show all versions of norconex-commons-lang Show documentation
Norconex Commons Lang is a Java library containing utility classes that complements the Java API and are not found in commonly available libraries (such as the great Apache Commons Lang, which it relies on).
/* Copyright 2010-2016 Norconex Inc.
*
* 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.
*/
package com.norconex.commons.lang.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.LinkedList;
import org.apache.commons.io.Charsets;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
/**
* Utility methods when dealing with files and directories.
* @author Pascal Essiembre
* @deprecated Since 1.4.0, use {@link com.norconex.commons.lang.file.FileUtil}
*/
@Deprecated
public final class FileUtil {
private FileUtil() {
super();
}
/**
* Converts any String to a valid file-system file name representation. The
* valid file name is constructed so it can be written to virtually any
* operating system.
* Use {@link #fromSafeFileName(String)} to get back the original name.
* @param unsafeFileName the file name to make safe.
* @return valid file name
*/
public static String toSafeFileName(String unsafeFileName) {
return com.norconex.commons.lang.file.FileUtil.toSafeFileName(
unsafeFileName);
}
/**
* Converts a "safe" file name originally created with
* {@link #toSafeFileName(String)} into its original string.
* @param safeFileName the file name to convert to its origianl form
* @return original string
*/
public static String fromSafeFileName(String safeFileName) {
return com.norconex.commons.lang.file.FileUtil.fromSafeFileName(
safeFileName);
}
/**
* Moves a file to a directory. Like {@link #moveFile(File, File)}:
*
* - If the target directory does not exists, it creates it first.
* - If the target file already exists, it deletes it first.
* - If target file deletion does not work, it will try 10 times,
* waiting 1 second between each try to give a chance to whatever
* OS lock on the file to go.
* - It throws a IOException if the move failed (as opposed to fail
* silently).
*
* @param sourceFile source file to move
* @param targetDir target destination
* @throws IOException cannot move file.
*/
public static void moveFileToDir(File sourceFile, File targetDir)
throws IOException {
com.norconex.commons.lang.file.FileUtil.moveFileToDir(
sourceFile, targetDir);
}
/**
* Moves a file to a new file location. This method is different from the
* {@link File#renameTo(File)} method in such that:
*
* - If the target file already exists, it deletes it first.
* - If target file deletion does not work, it will try 10 times,
* waiting 1 second between each try to give a chance to whatever
* OS lock on the file to go.
* - It throws a IOException if the move failed (as opposed to fail
* silently).
*
* @param sourceFile source file to move
* @param targetFile target destination
* @throws IOException cannot move file.
*/
public static void moveFile(File sourceFile, File targetFile)
throws IOException {
com.norconex.commons.lang.file.FileUtil.moveFile(
sourceFile, targetFile);
}
/**
* Deletes a file or a directory recursively. This method does:
*
* - If file or directory deletion does not work, it will try 10 times,
* waiting 1 second between each try to give a chance to whatever
* OS lock on the file to go.
* - It throws a IOException if the delete failed (as opposed to fail
* silently).
* - If file is
null
or does not exist, nothing happens.
*
* @param file file or directory to delete
* @throws IOException cannot delete file.
*/
public static void deleteFile(File file) throws IOException {
com.norconex.commons.lang.file.FileUtil.delete(file);
}
/**
* Deletes all directories that are empty from a given parent directory.
* @param parentDir the directory where to start looking for empty
* directories
* @return the number of deleted directories
*/
public static int deleteEmptyDirs(File parentDir) {
return com.norconex.commons.lang.file.FileUtil.deleteEmptyDirs(
parentDir);
}
/**
* Deletes all directories that are empty and are older
* than the given date. If the date is null
, all empty
* directories will be deleted, regardless of their date.
* @param parentDir the directory where to start looking for empty
* directories
* @param date the date to compare empty directories against
* @return the number of deleted directories
* @since 1.3.0
*/
public static int deleteEmptyDirs(File parentDir, final Date date) {
return com.norconex.commons.lang.file.FileUtil.deleteEmptyDirs(
parentDir, date);
}
/**
* Create all parent directories for a file if they do not exists.
* If they exist already, this method does nothing. This method assumes
* the last segment is a file or will be a file.
* @param file the file to create parent directories for
* @return The newly created parent directory
* @throws IOException if somethign went wrong creating the parent
* directories
*/
public static File createDirsForFile(File file) throws IOException {
return com.norconex.commons.lang.file.FileUtil.createDirsForFile(file);
}
/**
* Visits all files and directories under a directory.
* @param dir the directory
* @param visitor the visitor
*/
public static void visitAllDirsAndFiles(File dir, IFileVisitor visitor) {
visitAllDirsAndFiles(dir, visitor, null);
}
/**
* Visits all files and directories under a directory.
* @param dir the directory
* @param visitor the visitor
* @param filter an optional filter to restrict the files being visited
*/
public static void visitAllDirsAndFiles(
File dir, IFileVisitor visitor, FileFilter filter) {
visitor.visit(dir);
if (!dir.exists()) {
return;
} else if (dir.isDirectory()) {
File[] children = dir.listFiles(filter);
if (children != null) {
for (int i=0; i lines = new LinkedList<>();
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), encoding));
int remainingLinesToRead = numberOfLinesToRead;
String line = StringUtils.EMPTY;
while(line != null && remainingLinesToRead-- > 0){
line = reader.readLine();
if (!stripBlankLines || StringUtils.isNotBlank(line)) {
if (filter != null && filter.accept(line)) {
lines.addFirst(line);
} else {
remainingLinesToRead++;
}
} else {
remainingLinesToRead++;
}
}
reader.close();
return lines.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}
/**
* Returns the specified number of lines starting from the end
* of a text file.
* @param file the file to read lines from
* @param numberOfLinesToRead the number of lines to read
* @return array of file lines
* @throws IOException i/o problem
*/
public static String[] tail(File file, int numberOfLinesToRead)
throws IOException {
return tail(file, Charsets.ISO_8859_1.toString(), numberOfLinesToRead);
}
/**
* Returns the specified number of lines starting from the end
* of a text file.
* @param file the file to read lines from
* @param encoding the file encoding
* @param numberOfLinesToRead the number of lines to read
* @return array of file lines
* @throws IOException i/o problem
*/
public static String[] tail(File file, String encoding,
int numberOfLinesToRead) throws IOException {
return tail(file, encoding, numberOfLinesToRead, true);
}
/**
* Returns the specified number of lines starting from the end
* of a text file.
* @param file the file to read lines from
* @param encoding the file encoding
* @param numberOfLinesToRead the number of lines to read
* @param stripBlankLines whether to return blank lines or not
* @return array of file lines
* @throws IOException i/o problem
*/
public static String[] tail(File file, String encoding,
int numberOfLinesToRead, boolean stripBlankLines)
throws IOException {
return tail(file, encoding, numberOfLinesToRead, stripBlankLines, null);
}
/**
* Returns the specified number of lines starting from the end
* of a text file.
* @param file the file to read lines from
* @param encoding the file encoding
* @param numberOfLinesToRead the number of lines to read
* @param stripBlankLines whether to return blank lines or not
* @param filter InputStream filter
* @return array of file lines
* @throws IOException i/o problem
*/
public static String[] tail(File file, String encoding,
final int numberOfLinesToRead, boolean stripBlankLines,
IInputStreamFilter filter)
throws IOException {
assertFile(file);
assertNumOfLinesToRead(numberOfLinesToRead);
LinkedList lines = new LinkedList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new ReverseFileInputStream(file), encoding));
int remainingLinesToRead = numberOfLinesToRead;
String line = StringUtils.EMPTY;
while(line != null && remainingLinesToRead-- > 0){
line = StringUtils.defaultString(reader.readLine());
char[] chars = line.toCharArray();
for (int j = 0, k = chars.length - 1; j < k; j++, k--) {
char temp = chars[j];
chars[j] = chars[k];
chars[k] = temp;
}
String newLine = new String(chars);
if (!stripBlankLines || StringUtils.isNotBlank(line)) {
if (filter != null && filter.accept(newLine)) {
lines.addFirst(newLine);
} else {
remainingLinesToRead++;
}
} else {
remainingLinesToRead++;
}
}
reader.close();
return lines.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}
/**
* Creates (if not already existing) a series of directories reflecting
* the current date, up to the day unit, under a given parent directory.
* For example, a date of 2000-12-31 will create the following directory
* structure:
*
* /<parentDir>/2000/12/31/
*
* @param parentDir the parent directory where to create date directories
* @return the directory representing the full path created
* @throws IOException if the parent directory is not valid
*/
public static File createDateDirs(File parentDir) throws IOException {
return com.norconex.commons.lang.file.FileUtil.createDateDirs(
parentDir);
}
/**
* Creates (if not already existing) a series of directories reflecting
* a date, up to the day unit, under a given parent directory. For example,
* a date of 2000-12-31 will create the following directory structure:
*
* /<parentDir>/2000/12/31/
*
* @param parentDir the parent directory where to create date directories
* @param date the date to create directories from
* @return the directory representing the full path created
* @throws IOException if the parent directory is not valid
*/
public static File createDateDirs(File parentDir, Date date)
throws IOException {
return com.norconex.commons.lang.file.FileUtil.createDateDirs(
parentDir, date);
}
/**
* Creates (if not already existing) a series of directories reflecting
* the current date and time, up to the seconds, under a given parent
* directory. For example, a date of 2000-12-31T13:34:12 will create the
* following directory structure:
*
* /<parentDir>/2000/12/31/13/34/12/
*
* @param parentDir the parent directory where to create date directories
* @return the directory representing the full path created
* @throws IOException if the parent directory is not valid
*/
public static File createDateTimeDirs(File parentDir) throws IOException {
return com.norconex.commons.lang.file.FileUtil.createDateTimeDirs(
parentDir);
}
/**
* Creates (if not already existing) a series of directories reflecting
* a date and time, up to the seconds, under a given parent directory.
* For example,
* a date of 2000-12-31T13:34:12 will create the following directory
* structure:
*
* /<parentDir>/2000/12/31/13/34/12/
*
* @param parentDir the parent directory where to create date directories
* @param dateTime the date to create directories from
* @return the directory representing the full path created
* @throws IOException if the parent directory is not valid
*/
public static File createDateTimeDirs(File parentDir, Date dateTime)
throws IOException {
return com.norconex.commons.lang.file.FileUtil.createDateTimeDirs(
parentDir, dateTime);
}
private static void assertNumOfLinesToRead(int num) {
if (num <= 0) {
throw new IllegalArgumentException(
"Not a valid number to read: " + num);
}
}
private static void assertFile(File file) throws IOException {
if (file == null || !file.exists()
|| !file.isFile() || !file.canRead()) {
throw new IOException("Not a valid file: " + file);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy