
org.pathvisio.libgpml.util.FileUtils Maven / Gradle / Ivy
/*******************************************************************************
* PathVisio, a tool for data visualization and analysis using biological pathways
* Copyright 2006-2022 BiGCaT Bioinformatics, WikiPathways
*
* 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 org.pathvisio.libgpml.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import org.pathvisio.libgpml.debug.Logger;
/**
* Collection of static utility methods dealing with files.
*
* @author unknown
*/
public class FileUtils {
/**
* Returns all files in a directory
*
* @param directory The directory to get the files from
* @param recursive Whether to include sub directories or not
* @return A list of files in the given directory
*/
public static List getFiles(File directory, boolean recursive) {
List fileList = new ArrayList();
if (!directory.isDirectory()) { // File is not a directory, return file itself (if has correct extension)
fileList.add(directory);
return fileList;
}
// Get all files in this directory
File[] files = directory.listFiles();
// Recursively add the files
for (File f : files) {
if (f.isDirectory()) {
if (recursive)
fileList.addAll(getFiles(f, true));
} else
fileList.add(f);
}
return fileList;
}
/**
* Returns all files in a directory
*
* @param directory the directory to get the files from
* @param extension the extension of the files to get, without the dot so e.g.
* "gpml"
* @param recursive whether to include subdirectories or not
* @return A list of files with given extension present in the given directory
*/
public static List getFiles(File directory, final String extension, boolean recursive) {
List fileList = new ArrayList();
if (!directory.isDirectory()) { // File is not a directory, return file itself (if has correct extension)
if (directory.getName().endsWith("." + extension))
fileList.add(directory);
return fileList;
}
// Get all files in this directory
File[] files = directory.listFiles(new FileFilter() {
public boolean accept(File f) {
return (f.isDirectory() || f.getName().endsWith("." + extension)) ? true : false;
}
});
// Recursively add the files
for (File f : files) {
if (f.isDirectory()) {
if (recursive)
fileList.addAll(getFiles(f, extension, true));
} else
fileList.add(f);
}
return fileList;
}
/**
* Determines the number of lines in the given file.
*
* @param fileName the file to get the number of lines from
* @return the number of lines, or -1 if unable to determine the number of lines
*/
public static int getNrLines(String fileName) {
int nrLines = -1;
try {
RandomAccessFile randFile = new RandomAccessFile(fileName, "r");
long lastRec = randFile.length();
randFile.close();
FileReader fileRead = new FileReader(fileName);
LineNumberReader lineRead = new LineNumberReader(fileRead);
lineRead.skip(lastRec);
nrLines = lineRead.getLineNumber() - 1;
fileRead.close();
lineRead.close();
} catch (IOException e) {
Logger.log.error("Unable to determine number of lines in file " + fileName, e);
}
return nrLines;
}
/**
* Returns file name extension.
*
* @param fileName file as a String
* @return fragment of the filename after the '.'. Returns null if there was no
* '.'.
*/
public static String getExtension(String fileName) {
int dot = fileName.lastIndexOf('.');
String ext = null;
if (dot >= 0) {
ext = fileName.substring(dot + 1, fileName.length());
}
return ext;
}
/**
* Removes the file extension (everything from the last occurence of '.')
*/
public static String removeExtension(String fname) {
int dot = fname.lastIndexOf('.');
if (dot > 0)
fname = fname.substring(0, dot);
return fname;
}
/**
* Replaces file extension with something else. If there was no extension
* previously, the new one will simply be added.
*
* @param fname the file name to use.
* @param extension the new extension to use. Should not include dot.
*/
public static File replaceExtension(File fname, String extension) {
return new File(removeExtension(fname.toString()) + "." + extension);
}
/**
* Downloads a remote file given by an URL to the given local file
*
* @param url the URL that specifies the location of the file to download
* @param toFile the local file to which the remote file will be downloaded
* @throws IOException
*/
public static void downloadFile(URL url, File toFile) throws IOException {
OutputStream out = null;
URLConnection conn = null;
InputStream in = null;
out = new BufferedOutputStream(new FileOutputStream(toFile));
conn = url.openConnection();
conn.setUseCaches(false);
in = conn.getInputStream();
byte[] buffer = new byte[1024];
int numRead;
long numWritten = 0;
while ((numRead = in.read(buffer)) != -1) {
out.write(buffer, 0, numRead);
numWritten += numRead;
}
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
/**
* Maps a file from one point in the directory tree to another point. For
* example, with this function you can map from
*
* /home/username/input/pathways/human/metabolomic/pathway.gpml to
* /tmp/output/pathways/human/metabolomic/pathway.gpml
*
* @param f the file.
* @param srcDir the source directory.
* @param destDir the destination directory.
* @return the file.
*/
public static File mapFileTree(File f, File srcDir, File destDir) {
List components = new ArrayList();
File dest = destDir;
File src = f;
// unwind source
while (!src.equals(srcDir) && src != null) {
components.add(f.getName());
src = src.getParentFile();
}
// rewind dest
for (String s : components) {
dest = new File(destDir, s);
}
return dest;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy