package de.lmu.ifi.dbs.elki.utilities; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2011 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; import java.util.zip.GZIPInputStream; /** * Various static helper methods to deal with files and file names. * * @author Erich Schubert */ public final class FileUtil { /** * Returns the lower case extension of the selected file. * * If no file is selected, null is returned. * * @param file File object * @return Returns the extension of the selected file in lower case or * null */ public static String getFilenameExtension(File file) { return getFilenameExtension(file.getName()); } /** * Returns the lower case extension of the selected file. * * If no file is selected, null is returned. * * @param name File name * @return Returns the extension of the selected file in lower case or * null */ public static String getFilenameExtension(String name) { if(name == null) { return null; } int index = name.lastIndexOf("."); if(index >= name.length() - 1) { return null; } return name.substring(name.lastIndexOf(".") + 1).toLowerCase(); } /** * Try to open a file, first trying the file system, * then falling back to the classpath. * * @param filename File name in system notation * @return Input stream * @throws FileNotFoundException When no file was found. */ public static InputStream openSystemFile(String filename) throws FileNotFoundException { try { return new FileInputStream(filename); } catch(FileNotFoundException e) { // try with classloader String resname = filename.replace(File.separatorChar, '/'); InputStream result = ClassLoader.getSystemResourceAsStream(resname); if (result == null) { throw e; } return result; } } /** * Try to open a stream as gzip, if it starts with the gzip magic. * * TODO: move to utils package. * * @param in original input stream * @return old input stream or a {@link GZIPInputStream} if appropriate. * @throws IOException on IO error */ public static InputStream tryGzipInput(InputStream in) throws IOException { // try autodetecting gzip compression. if (!in.markSupported()) { PushbackInputStream pb = new PushbackInputStream(in, 16); in = pb; // read a magic from the file header byte[] magic = {0, 0}; pb.read(magic); pb.unread(magic); if (magic[0] == 31 && magic[1] == -117) { in = new GZIPInputStream(pb); } } else if (in.markSupported()) { in.mark(16); if (in.read() == 31 && in.read() == -117) { in.reset(); in = new GZIPInputStream(in); } else { // just rewind the stream in.reset(); } } return in; } /** * Try to locate an file in the filesystem, given a partial name and a prefix. * * @param name file name * @param basedir extra base directory to try * @return file, if the file could be found. {@code null} otherwise */ public static File locateFile(String name, String basedir) { // Try exact match first. File f = new File(name); if(f.exists()) { return f; } // Try with base directory if(basedir != null) { f = new File(basedir, name); // logger.warning("Trying: "+f.getAbsolutePath()); if(f.exists()) { return f; } } // try stripping whitespace { String name2 = name.trim(); if(!name.equals(name2)) { // logger.warning("Trying without whitespace."); f = locateFile(name2, basedir); if(f != null) { return f; } } } // try substituting path separators { String name2 = name.replace('/',File.separatorChar); if (!name.equals(name2)) { // logger.warning("Trying with replaced separators."); f = locateFile(name2, basedir); if(f != null) { return f; } } name2 = name.replace('\\',File.separatorChar); if (!name.equals(name2)) { // logger.warning("Trying with replaced separators."); f = locateFile(name2, basedir); if(f != null) { return f; } } } // try stripping extra characters, such as quotes. if(name.length() > 2 && name.charAt(0) == '"' && name.charAt(name.length() - 1) == '"') { // logger.warning("Trying without quotes."); f = locateFile(name.substring(1, name.length() - 1), basedir); if(f != null) { return f; } } return null; } }