hal/src/zutil/io/file/FileUtil.java

353 lines
11 KiB
Java
Raw Normal View History

2015-05-27 13:13:19 +00:00
/*
* The MIT License (MIT)
*
* Copyright (c) 2015 Ziver Koc
2013-05-28 19:29:24 +00:00
*
2011-07-13 17:53:17 +00:00
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
2013-05-28 19:29:24 +00:00
*
2011-07-13 17:53:17 +00:00
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
2013-05-28 19:29:24 +00:00
*
2011-07-13 17:53:17 +00:00
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
2015-05-27 13:13:19 +00:00
*/
2013-05-28 19:29:24 +00:00
2010-10-27 18:02:44 +00:00
package zutil.io.file;
2008-11-14 16:38:36 +00:00
import zutil.io.IOUtil;
import zutil.log.LogUtil;
import java.io.*;
2008-11-14 16:38:36 +00:00
import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
2011-06-24 23:20:59 +00:00
import java.util.logging.Logger;
2008-11-14 16:38:36 +00:00
import java.util.regex.Matcher;
/**
* File path utilities
*
* @author Ziver
*/
public class FileUtil {
2013-12-17 19:18:14 +00:00
private static final Logger logger = LogUtil.getLogger();
2008-11-14 16:38:36 +00:00
/**
* Returns a String with a relative path from the given path
*
2010-10-27 18:02:44 +00:00
* @param file is the file to get a relative path from
* @param path is the path
* @return A String with a relative path
2008-11-14 16:38:36 +00:00
*/
public static String relativePath(File file, String path){
2011-06-24 23:20:59 +00:00
if( file == null || path == null )
return null;
2008-11-14 16:38:36 +00:00
String absolute = file.getAbsolutePath();
String tmpPath = path.replaceAll(
"[/\\\\]",
Matcher.quoteReplacement(File.separator));
String relative = absolute.substring(
absolute.indexOf(tmpPath)+path.length(),
absolute.length());
return relative;
}
/**
* Returns the File object for the given file.
* Can not point to files in JAR files.
2008-11-14 16:38:36 +00:00
*
2010-10-27 18:02:44 +00:00
* @param path is the path to the file (no / if not absolute path)
* @return A File object for the file
2008-11-14 16:38:36 +00:00
*/
public static File find(String path){
try {
File file = new File(path);
if(file!=null && file.exists()){
return file;
}
2015-05-04 16:41:55 +00:00
URL url = findURL(path);
if(url != null)
return new File(url.toURI());
2008-11-14 16:38:36 +00:00
} catch (Exception e) {
2010-07-02 20:16:37 +00:00
e.printStackTrace();
2008-11-14 16:38:36 +00:00
}
return null;
}
/**
* Returns the URL to the given file
*
2010-10-27 18:02:44 +00:00
* @param path is the path to the file (no / if not absolute path)
* @return A URL object for the file
* @throws URISyntaxException
*/
public static URL findURL(String path){
2010-07-02 20:16:37 +00:00
return Thread.currentThread().getContextClassLoader().getResource(path);
}
/**
* Returns a InputStream from the path
*
2010-10-27 18:02:44 +00:00
* @param path is the path to the file (no / if not absolute path)
* @return A InputStream object for the file
*/
public static InputStream getInputStream(String path){
try {
File file = new File(path);
if(file!=null && file.exists()){
return new BufferedInputStream( new FileInputStream( file ) );
}
2010-07-02 20:16:37 +00:00
return Thread.currentThread().getContextClassLoader()
.getResourceAsStream(path);
} catch (Exception e) {
2010-07-02 20:16:37 +00:00
e.printStackTrace();
}
return null;
}
2009-01-13 00:48:46 +00:00
/**
* Reads and returns the content of a file as a String.
* Or use FileUtils.readFileToString(file);
*
2013-12-17 19:18:14 +00:00
* @param file
* @return the file content
2009-01-13 00:48:46 +00:00
*/
2015-03-23 21:05:51 +00:00
public static String getContent(File file) throws IOException{
2013-12-17 19:18:14 +00:00
InputStream in = new FileInputStream(file);
String data = new String(IOUtil.getContent( in ));
in.close();
return data;
}
/**
* Reads and returns the content of a file as a String.
* Or use FileUtils.readFileToString(file);
*
2013-12-17 19:18:14 +00:00
* @param url
* @return the file content
*/
public static String getContent(URL url) throws IOException{
2013-12-17 19:18:14 +00:00
InputStream in = url.openStream();
String data = new String(IOUtil.getContent( in ));
in.close();
return data;
2009-01-13 00:48:46 +00:00
}
/**
* Cache for the search functions
*/
private static HashMap<SearchItem,List<File>> search_cache = new HashMap<SearchItem,List<File>>();
/**
* An Cache Item class to identify different cached items
* @author Ziver
*/
private static class SearchItem{
private File dir;
private boolean folders;
private int recurse;
protected SearchItem(File dir, boolean folders, int recurse){
this.dir = dir;
this.folders = folders;
this.recurse = recurse;
}
public boolean equals(Object o){
if(o!=null && o instanceof SearchItem){
SearchItem si = (SearchItem)o;
return dir.equals(si.dir) && folders == si.folders && recurse == si.recurse;
}
return false;
}
public int hashCode(){
int hash = 133;
hash = 23 * hash + dir.hashCode();
hash = 23 * hash + (folders ? 1 : 0);
hash = 23 * hash + recurse;
return 0;
}
}
/**
2010-10-27 18:02:44 +00:00
* Same as search(File dir) but it caches the result
* to be used next time this function is called with
* the same parameters.
*/
public static List<File> cachedSearch(File dir){
return cachedSearch(dir, new LinkedList<File>(), true);
}
/**
* Same as search(File dir, List<File> fileList, boolean recursive)
2010-10-27 18:02:44 +00:00
* but is caches the result to be used next time this function is
* called with the same parameters.
*/
public static List<File> cachedSearch(File dir, List<File> fileList, boolean recursive){
return cachedSearch(dir, new LinkedList<File>(), false, (recursive ? Integer.MAX_VALUE : 0));
}
/**
* Same as search(File dir, List<File> fileList, boolean folders, int recurse)
* but is caches the result to be used next time this function is called
* with the same parameters.
*/
public static List<File> cachedSearch(File dir, List<File> fileList, boolean folders, int recurse){
SearchItem si = new SearchItem(dir, folders, recurse);
if( search_cache.containsKey(si) ){
fileList.addAll( search_cache.get(si) );
return fileList;
}
search(dir, fileList, folders, recurse);
search_cache.put(si, fileList);
return fileList;
}
2008-11-14 16:38:36 +00:00
/**
2010-04-15 20:52:34 +00:00
* Returns a List with all the files in a folder and sub folders
2008-11-14 16:38:36 +00:00
*
2010-10-27 18:02:44 +00:00
* @param dir is the directory to search in
* @return The List with the files
2008-11-14 16:38:36 +00:00
*/
public static List<File> search(File dir){
return search(dir, new LinkedList<File>(), true);
2008-11-14 16:38:36 +00:00
}
/**
* Returns a ArrayList with all the files in a folder and sub folders
*
2010-10-27 18:02:44 +00:00
* @param dir is the directory to search in
* @param fileList is the List to add the files to
* @param recursive is if the method should search the sub directories to.
* @return A List with the files
2008-11-14 16:38:36 +00:00
*/
public static List<File> search(File dir, List<File> fileList, boolean recursive){
2010-04-15 20:52:34 +00:00
return search(dir, new LinkedList<File>(), false, (recursive ? Integer.MAX_VALUE : 0));
}
/**
* Returns a ArrayList with all the files in a folder and sub folders
*
2010-10-27 18:02:44 +00:00
* @param dir is the directory to search in
* @param fileList is the List to add the files to
* @param folders is if the method should add the folders to the List
* @param recurse is how many times it should recurse into folders
* @return A List with the files and/or folders
2010-04-15 20:52:34 +00:00
*/
public static List<File> search(File dir, List<File> fileList, boolean folders, int recurse){
if(recurse<0)
return fileList;
--recurse;
if(folders){
fileList.add( dir );
}
2008-11-14 16:38:36 +00:00
2010-04-15 20:52:34 +00:00
File file;
String[] temp = dir.list();
if(temp != null){
for(int i=0; i<temp.length ;i++){
file = new File(dir.getPath()+File.separator+temp[i]);
2010-04-15 20:52:34 +00:00
if(file.isDirectory()){
2011-06-24 23:20:59 +00:00
logger.finer("Found Folder: "+file);
2010-04-15 20:52:34 +00:00
search(new File(dir.getPath()+File.separator+temp[i]+File.separator), fileList, folders, recurse);
}
else if(file.isFile()){
2011-06-24 23:20:59 +00:00
logger.finer("Found File: "+file);
fileList.add(file);
}
2008-11-14 16:38:36 +00:00
}
}
return fileList;
}
/**
* Returns the extension(without the dot) of the file. e.g. "png" "avi"
*
2010-10-27 18:02:44 +00:00
* @param file is the file
* @return The extension
2008-11-14 16:38:36 +00:00
*/
2011-02-12 19:28:13 +00:00
public static String getFileExtension(File file){
return getFileExtension(file.getName());
2008-11-14 16:38:36 +00:00
}
/**
2011-09-14 17:02:06 +00:00
* Returns the extension(without the dot) of the file. e.g. "png" "avi"
*
2010-10-27 18:02:44 +00:00
* @param file is the file
* @return The extension
2008-11-14 16:38:36 +00:00
*/
2011-02-12 19:28:13 +00:00
public static String getFileExtension(String file){
if( file == null || file.lastIndexOf(".") == -1 )
2008-11-14 16:38:36 +00:00
return "";
return file.substring(file.lastIndexOf(".")+1, file.length());
2008-11-14 16:38:36 +00:00
}
2011-09-14 17:02:06 +00:00
/**
* Replaces the current extension on the file withe the given one.
*
2015-03-23 21:05:51 +00:00
* @param file is the name of the file
* @param ext is the new extension, without the dot
2011-09-14 17:02:06 +00:00
* @return
*/
public static String changeExtension(String file, String ext) {
if( file == null )
return null;
if( file.lastIndexOf(".") == -1 )
return file+"."+ext;
return file.substring(0, file.lastIndexOf(".")+1)+ext;
}
2008-11-14 16:38:36 +00:00
/**
* This function will replace some data between two boundaries.
* If the boundary is not found it will be added to the end of the file.
*
* @param file is the file to modify
* @param boundary is the start and end boundary to put the data between, this is a full line boundary.
* @param data is the data that will be written to the file
*/
public static void writeBetweenBoundary(File file, String boundary, String data) throws IOException{
BufferedReader in = new BufferedReader(new FileReader(file));
StringBuilder output = new StringBuilder();
String line;
while((line = in.readLine()) != null){
// Found starting boundary
if(line.equals(boundary)){
while((line = in.readLine()) != null)
// Find ending boundary
if(line.equals(boundary)) break;
// EOF and no ending boundary found
if(line == null){
in.close();
throw new EOFException("No ending boundary found");
}
// Write the new data
output.append(boundary).append('\n');
output.append(data).append('\n');
output.append(boundary).append('\n');
}
else
output.append(line).append('\n');
}
in.close();
// Save changes
FileWriter out = new FileWriter(file);
out.write(output.toString());
out.close();
}
2008-11-14 16:38:36 +00:00
}