diff options
Diffstat (limited to 'libjava/java/io/File.java')
-rw-r--r-- | libjava/java/io/File.java | 1576 |
1 files changed, 0 insertions, 1576 deletions
diff --git a/libjava/java/io/File.java b/libjava/java/io/File.java deleted file mode 100644 index ff008e0..0000000 --- a/libjava/java/io/File.java +++ /dev/null @@ -1,1576 +0,0 @@ -/* File.java -- Class representing a file on disk - Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2012 - Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package java.io; - -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import gnu.classpath.Configuration; - -/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * Status: Complete to version 1.3. - */ - -/** - * This class represents a file or directory on a local disk. It provides - * facilities for dealing with a variety of systems that use various - * types of path separators ("/" versus "\", for example). It also - * contains method useful for creating and deleting files and directories. - * - * @author Aaron M. Renn (arenn@urbanophile.com) - * @author Tom Tromey (tromey@cygnus.com) - */ -public class File implements Serializable, Comparable<File> -{ - private static final long serialVersionUID = 301077366599181567L; - - // QUERY arguments to access function. - private final static int READ = 0; - private final static int WRITE = 1; - private final static int EXISTS = 2; - private final static int EXEC = 3; - - // QUERY arguments to stat function. - private final static int DIRECTORY = 0; - private final static int ISFILE = 1; - private final static int ISHIDDEN = 2; - - // QUERY arguments to attr function. - private final static int MODIFIED = 0; - private final static int LENGTH = 1; - - private final native long attr (int query); - private final native boolean access (int query); - private final native boolean stat (int query); - - /** - * This is the path separator string for the current host. This field - * contains the value of the <code>file.separator</code> system property. - * An example separator string would be "/" on the GNU system. - */ - public static final String separator = System.getProperty("file.separator"); - private static final String dupSeparator = separator + separator; - - /** - * This is the first character of the file separator string. On many - * hosts (for example, on the GNU system), this represents the entire - * separator string. The complete separator string is obtained from the - * <code>file.separator</code>system property. - */ - public static final char separatorChar = separator.charAt(0); - - /** - * This is the string that is used to separate the host name from the - * path name in paths that include the host name. It is the value of - * the <code>path.separator</code> system property. - */ - public static final String pathSeparator - = System.getProperty("path.separator"); - - /** - * This is the first character of the string used to separate the host name - * from the path name in paths that include a host. The separator string - * is taken from the <code>path.separator</code> system property. - */ - public static final char pathSeparatorChar = pathSeparator.charAt(0); - - static final String tmpdir = System.getProperty("java.io.tmpdir"); - /* If 0, then the system doesn't have a file name length limit. */ - static int maxPathLen; - static boolean caseSensitive; - - static - { - if (Configuration.INIT_LOAD_LIBRARY) - { - System.loadLibrary("javaio"); - } - - init_native(); - } - - // Native function called at class initialization. This should should - // set the maxPathLen and caseSensitive variables. - private static native void init_native(); - - /** - * This is the path to the file set when the object is created. It - * may be an absolute or relative path name. - */ - private String path; - - // We keep a counter for use by createTempFile. We choose the first - // value randomly to try to avoid clashes with other VMs. - private static long counter = Double.doubleToLongBits (Math.random()); - - /** - * This method tests whether or not the current thread is allowed to - * to read the file pointed to by this object. This will be true if and - * and only if 1) the file exists and 2) the <code>SecurityManager</code> - * (if any) allows access to the file via it's <code>checkRead</code> - * method 3) the file is readable. - * - * @return <code>true</code> if reading is allowed, - * <code>false</code> otherwise - * - * @exception SecurityException If the <code>SecurityManager</code> - * does not allow access to the file - */ - public boolean canRead() - { - checkRead(); - return access (READ); - } - - /** - * This method test whether or not the current thread is allowed to - * write to this object. This will be true if and only if 1) The - * <code>SecurityManager</code> (if any) allows write access to the - * file and 2) The file exists and 3) The file is writable. To determine - * whether or not a non-existent file can be created, check the parent - * directory for write access. - * - * @return <code>true</code> if writing is allowed, <code>false</code> - * otherwise - * - * @exception SecurityException If the <code>SecurityManager</code> - * does not allow access to the file - */ - public boolean canWrite() - { - checkWrite(); - return access (WRITE); - } - - /** - * This method tests whether or not the current thread is allowed to - * to execute the file pointed to by this object. This will be true if and - * and only if 1) the file exists and 2) the <code>SecurityManager</code> - * (if any) allows access to the file via it's <code>checkExec</code> - * method 3) the file is executable. - * - * @return <code>true</code> if execution is allowed, - * <code>false</code> otherwise - * - * @exception SecurityException If the <code>SecurityManager</code> - * does not allow access to the file - */ - public boolean canExecute() - { - if (!exists()) - return false; - checkExec(); - return access (EXEC); - } - - private native boolean performCreate() throws IOException; - - /** - * This method creates a new file of zero length with the same name as - * the path of this <code>File</code> object if an only if that file - * does not already exist. - * <p> - * A <code>SecurityManager.checkWrite</code> check is done prior - * to performing this action. - * - * @return <code>true</code> if the file was created, <code>false</code> if - * the file alread existed. - * - * @exception IOException If an I/O error occurs - * @exception SecurityException If the <code>SecurityManager</code> will - * not allow this operation to be performed. - * - * @since 1.2 - */ - public boolean createNewFile() throws IOException - { - checkWrite(); - return performCreate(); - } - - /* - * This native method handles the actual deleting of the file - */ - private native boolean performDelete(); - - /** - * This method deletes the file represented by this object. If this file - * is a directory, it must be empty in order for the delete to succeed. - * - * @return <code>true</code> if the file was deleted, <code>false</code> - * otherwise - * - * @exception SecurityException If deleting of the file is not allowed - */ - public synchronized boolean delete() - { - SecurityManager s = System.getSecurityManager(); - - if (s != null) - s.checkDelete(path); - - return performDelete(); - } - - /** - * This method tests two <code>File</code> objects for equality by - * comparing the path of the specified <code>File</code> against the path - * of this object. The two objects are equal if an only if 1) The - * argument is not null 2) The argument is a <code>File</code> object and - * 3) The path of the <code>File</code>argument is equal to the path - * of this object. - * <p> - * The paths of the files are determined by calling the - * <code>getPath()</code> - * method on each object. - * - * @return <code>true</code> if the two objects are equal, - * <code>false</code> otherwise. - */ - public boolean equals(Object obj) - { - if (! (obj instanceof File)) - return false; - - File other = (File) obj; - - if (caseSensitive) - return path.equals(other.path); - else - return path.equalsIgnoreCase(other.path); - } - - /* - * This method tests whether or not the file represented by the - * object actually exists on the filesystem. - */ - private boolean internalExists() - { - return access (EXISTS); - } - - /** - * This method tests whether or not the file represented by the object - * actually exists on the filesystem. - * - * @return <code>true</code> if the file exists, <code>false</code>otherwise. - * - * @exception SecurityException If reading of the file is not permitted - */ - public boolean exists() - { - checkRead(); - return internalExists(); - } - - /** - * This method initializes a new <code>File</code> object to represent - * a file with the specified path. - * - * @param name The path name of the file - */ - public File(String name) - { - path = normalizePath (name); - } - - // Remove duplicate and redundant separator characters. - private String normalizePath(String p) - { - // On Windows, convert any '/' to '\'. This appears to be the same logic - // that Sun's Win32 Java performs. - if (separatorChar == '\\') - { - p = p.replace ('/', '\\'); - // We have to special case the "\c:" prefix. - if (p.length() > 2 && p.charAt(0) == '\\' && - ((p.charAt(1) >= 'a' && p.charAt(1) <= 'z') || - (p.charAt(1) >= 'A' && p.charAt(1) <= 'Z')) && - p.charAt(2) == ':') - p = p.substring(1); - } - - int dupIndex = p.indexOf(dupSeparator); - int plen = p.length(); - - // Special case: permit Windows UNC path prefix. - if (dupSeparator.equals("\\\\") && dupIndex == 0) - dupIndex = p.indexOf(dupSeparator, 1); - - if (dupIndex == -1) - { - // Ignore trailing separator (though on Windows "a:\", for - // example, is a valid and minimal path). - if (plen > 1 && p.charAt (plen - 1) == separatorChar) - { - if (! (separatorChar == '\\' && plen == 3 && p.charAt (1) == ':')) - return p.substring (0, plen - 1); - } - else - return p; - } - - StringBuffer newpath = new StringBuffer(plen); - int last = 0; - while (dupIndex != -1) - { - newpath.append(p.substring(last, dupIndex)); - // Ignore the duplicate path characters. - while (p.charAt(dupIndex) == separatorChar) - { - dupIndex++; - if (dupIndex == plen) - return newpath.toString(); - } - newpath.append(separatorChar); - last = dupIndex; - dupIndex = p.indexOf(dupSeparator, last); - } - - // Again, ignore possible trailing separator (except special cases - // like "a:\" on Windows). - int end; - if (plen > 1 && p.charAt (plen - 1) == separatorChar) - { - if (separatorChar == '\\' && plen == 3 && p.charAt (1) == ':') - end = plen; - else - end = plen - 1; - } - else - end = plen; - newpath.append(p.substring(last, end)); - - return newpath.toString(); - } - - /** - * This method initializes a new <code>File</code> object to represent - * a file in the specified named directory. The path name to the file - * will be the directory name plus the separator string plus the file - * name. If the directory path name ends in the separator string, another - * separator string will still be appended. - * - * @param dirPath The path to the directory the file resides in - * @param name The name of the file - */ - public File(String dirPath, String name) - { - if (name == null) - throw new NullPointerException(); - if (dirPath != null) - { - if (dirPath.length() > 0) - { - // Try to be smart about the number of separator characters. - if (dirPath.charAt(dirPath.length() - 1) == separatorChar - || name.length() == 0) - path = normalizePath(dirPath + name); - else - path = normalizePath(dirPath + separatorChar + name); - } - else - { - // If dirPath is empty, use a system dependant - // default prefix. - // Note that the leading separators in name have - // to be chopped off, to prevent them forming - // a UNC prefix on Windows. - if (separatorChar == '\\' /* TODO use ON_WINDOWS */) - { - int skip = 0; - while(name.length() > skip - && (name.charAt(skip) == separatorChar - || name.charAt(skip) == '/')) - { - skip++; - } - name = name.substring(skip); - } - path = normalizePath(separatorChar + name); - } - } - else - path = normalizePath(name); - } - - /** - * This method initializes a new <code>File</code> object to represent - * a file in the specified directory. If the <code>directory</code> - * argument is <code>null</code>, the file is assumed to be in the - * current directory as specified by the <code>user.dir</code> system - * property - * - * @param directory The directory this file resides in - * @param name The name of the file - */ - public File(File directory, String name) - { - this (directory == null ? null : directory.path, name); - } - - /** - * This method initializes a new <code>File</code> object to represent - * a file corresponding to the specified <code>file:</code> protocol URI. - * - * @param uri The URI - * @throws IllegalArgumentException if the URI is not hierarchical - */ - public File(URI uri) - { - if (uri == null) - throw new NullPointerException("uri is null"); - - if (!uri.getScheme().equals("file")) - throw new IllegalArgumentException("invalid uri protocol"); - - String name = uri.getPath(); - if (name == null) - throw new IllegalArgumentException("URI \"" + uri - + "\" is not hierarchical"); - path = normalizePath(name); - } - - /** - * This method returns the path of this file as an absolute path name. - * If the path name is already absolute, then it is returned. Otherwise - * the value returned is the current directory plus the separatory - * string plus the path of the file. The current directory is determined - * from the <code>user.dir</code> system property. - * - * @return The absolute path of this file - */ - public String getAbsolutePath() - { - if (isAbsolute()) - return path; - else if (separatorChar == '\\' - && path.length() > 0 && path.charAt (0) == '\\') - { - // On Windows, even if the path starts with a '\\' it is not - // really absolute until we prefix the drive specifier from - // the current working directory to it. - return System.getProperty ("user.dir").substring (0, 2) + path; - } - else if (separatorChar == '\\' - && path.length() > 1 && path.charAt (1) == ':' - && ((path.charAt (0) >= 'a' && path.charAt (0) <= 'z') - || (path.charAt (0) >= 'A' && path.charAt (0) <= 'Z'))) - { - // On Windows, a process has a current working directory for - // each drive and a path like "G:foo\bar" would mean the - // absolute path "G:\wombat\foo\bar" if "\wombat" is the - // working directory on the G drive. - String drvDir = null; - try - { - drvDir = new File (path.substring (0, 2)).getCanonicalPath(); - } - catch (IOException e) - { - drvDir = path.substring (0, 2) + "\\"; - } - - // Note: this would return "C:\\." for the path "C:.", if "\" - // is the working folder on the C drive, but this is - // consistent with what Sun's JRE 1.4.1.01 actually returns! - if (path.length() > 2) - return drvDir + '\\' + path.substring (2, path.length()); - else - return drvDir; - } - else - return System.getProperty ("user.dir") + separatorChar + path; - } - - /** - * This method returns a <code>File</code> object representing the - * absolute path of this object. - * - * @return A <code>File</code> with the absolute path of the object. - * - * @since 1.2 - */ - public File getAbsoluteFile() - { - return new File(getAbsolutePath()); - } - - /** - * This method returns a canonical representation of the pathname of - * this file. The actual form of the canonical representation is - * system-dependent. On the GNU system, conversion to canonical - * form involves the removal of redundant separators, references to - * "." and "..", and symbolic links. - * <p> - * Note that this method, unlike the other methods which return path - * names, can throw an IOException. This is because native method - * might be required in order to resolve the canonical path - * - * @exception IOException If an error occurs - */ - public native String getCanonicalPath() throws IOException; - - /** - * This method returns a <code>File</code> object representing the - * canonical path of this object. - * - * @return A <code>File</code> instance representing the canonical path of - * this object. - * - * @exception IOException If an error occurs. - * - * @since 1.2 - */ - public File getCanonicalFile() throws IOException - { - return new File(getCanonicalPath()); - } - - /** - * This method returns the name of the file. This is everything in the - * complete path of the file after the last instance of the separator - * string. - * - * @return The file name - */ - public String getName() - { - int nameSeqIndex = 0; - - if (separatorChar == '\\' && path.length() > 1) - { - // On Windows, ignore the drive specifier or the leading '\\' - // of a UNC network path, if any (a.k.a. the "prefix"). - if ((path.charAt (0) == '\\' && path.charAt (1) == '\\') - || (((path.charAt (0) >= 'a' && path.charAt (0) <= 'z') - || (path.charAt (0) >= 'A' && path.charAt (0) <= 'Z')) - && path.charAt (1) == ':')) - { - if (path.length() > 2) - nameSeqIndex = 2; - else - return ""; - } - } - - String nameSeq - = (nameSeqIndex > 0 ? path.substring (nameSeqIndex) : path); - - int last = nameSeq.lastIndexOf (separatorChar); - - return nameSeq.substring (last + 1); - } - - /** - * This method returns a <code>String</code> the represents this file's - * parent. <code>null</code> is returned if the file has no parent. The - * parent is determined via a simple operation which removes the name - * after the last file separator character, as determined by the platform. - * - * @return The parent directory of this file - */ - public String getParent() - { - String prefix = null; - int nameSeqIndex = 0; - - // The "prefix", if present, is the leading "/" on UNIX and - // either the drive specifier (e.g. "C:") or the leading "\\" - // of a UNC network path on Windows. - if (separatorChar == '/' && path.charAt (0) == '/') - { - prefix = "/"; - nameSeqIndex = 1; - } - else if (separatorChar == '\\' && path.length() > 1) - { - if ((path.charAt (0) == '\\' && path.charAt (1) == '\\') - || (((path.charAt (0) >= 'a' && path.charAt (0) <= 'z') - || (path.charAt (0) >= 'A' && path.charAt (0) <= 'Z')) - && path.charAt (1) == ':')) - { - prefix = path.substring (0, 2); - nameSeqIndex = 2; - } - } - - // According to the JDK docs, the returned parent path is the - // portion of the name sequence before the last separator - // character, if found, prefixed by the prefix, otherwise null. - if (nameSeqIndex < path.length()) - { - String nameSeq = path.substring (nameSeqIndex, path.length()); - int last = nameSeq.lastIndexOf (separatorChar); - if (last == -1) - return prefix; - else if (last == (nameSeq.length() - 1)) - // Note: The path would not have a trailing separator - // except for cases like "C:\" on Windows (see - // normalizePath( )), where Sun's JRE 1.4 returns null. - return null; - else if (last == 0) - last++; - - if (prefix != null) - return prefix + nameSeq.substring (0, last); - else - return nameSeq.substring (0, last); - } - else - // Sun's JRE 1.4 returns null if the prefix is the only - // component of the path - so "/" gives null on UNIX and - // "C:", "\\", etc. return null on Windows. - return null; - } - - /** - * This method returns a <code>File</code> object representing the parent - * file of this one. - * - * @return a <code>File</code> for the parent of this object. - * <code>null</code> - * will be returned if this object does not have a parent. - * - * @since 1.2 - */ - public File getParentFile() - { - String parent = getParent(); - return parent != null ? new File(parent) : null; - } - - /** - * Returns the path name that represents this file. May be a relative - * or an absolute path name - * - * @return The pathname of this file - */ - public String getPath() - { - return path; - } - - /** - * This method returns a hash code representing this file. It is the - * hash code of the path of this file (as returned by <code>getPath()</code>) - * exclusived or-ed with the value 1234321. - * - * @return The hash code for this object - */ - public int hashCode() - { - if (caseSensitive) - return path.hashCode() ^ 1234321; - else - return path.toLowerCase().hashCode() ^ 1234321; - } - - /** - * This method returns true if this object represents an absolute file - * path and false if it does not. The definition of an absolute path varies - * by system. As an example, on GNU systems, a path is absolute if it starts - * with a "/". - * - * @return <code>true</code> if this object represents an absolute - * file name, <code>false</code> otherwise. - */ - public native boolean isAbsolute(); - - /* - * This method tests whether or not the file represented by this - * object is a directory. - */ - private boolean internalIsDirectory() - { - return stat (DIRECTORY); - } - - /** - * This method tests whether or not the file represented by this object - * is a directory. In order for this method to return <code>true</code>, - * the file represented by this object must exist and be a directory. - * - * @return <code>true</code> if this file is a directory, <code>false</code> - * otherwise - * - * @exception SecurityException If reading of the file is not permitted - */ - public boolean isDirectory() - { - checkRead(); - return internalIsDirectory(); - } - - /** - * This method tests whether or not the file represented by this object - * is a "plain" file. A file is a plain file if and only if it 1) Exists, - * 2) Is not a directory or other type of special file. - * - * @return <code>true</code> if this is a plain file, <code>false</code> - * otherwise - * - * @exception SecurityException If reading of the file is not permitted - */ - public boolean isFile() - { - checkRead(); - return stat (ISFILE); - } - - /** - * This method tests whether or not this file represents a "hidden" file. - * On GNU systems, a file is hidden if its name begins with a "." - * character. Files with these names are traditionally not shown with - * directory listing tools. - * - * @return <code>true</code> if the file is hidden, <code>false</code> - * otherwise. - * - * @since 1.2 - */ - public boolean isHidden() - { - checkRead(); - return stat (ISHIDDEN); - } - - /** - * This method returns the last modification time of this file. The - * time value returned is an abstract value that should not be interpreted - * as a specified time value. It is only useful for comparing to other - * such time values returned on the same system. In that case, the larger - * value indicates a more recent modification time. - * <p> - * If the file does not exist, then a value of 0 is returned. - * - * @return The last modification time of the file - * - * @exception SecurityException If reading of the file is not permitted - */ - public long lastModified() - { - checkRead(); - return attr (MODIFIED); - } - - /** - * This method returns the length of the file represented by this object, - * or 0 if the specified file does not exist. - * - * @return The length of the file - * - * @exception SecurityException If reading of the file is not permitted - */ - public long length() - { - checkRead(); - return attr (LENGTH); - } - - /* - * This native function actually produces the list of file in this - * directory - */ - private final native Object[] performList (FilenameFilter filter, - FileFilter fileFilter, - Class result_type); - - /** - * This method returns a array of <code>String</code>'s representing the - * list of files is then directory represented by this object. If this - * object represents a non-directory file or a non-existent file, then - * <code>null</code> is returned. The list of files will not contain - * any names such as "." or ".." which indicate the current or parent - * directory. Also, the names are not guaranteed to be sorted. - * <p> - * In this form of the <code>list()</code> method, a filter is specified - * that allows the caller to control which files are returned in the - * list. The <code>FilenameFilter</code> specified is called for each - * file returned to determine whether or not that file should be included - * in the list. - * <p> - * A <code>SecurityManager</code> check is made prior to reading the - * directory. If read access to the directory is denied, an exception - * will be thrown. - * - * @param filter An object which will identify files to exclude from - * the directory listing. - * - * @return An array of files in the directory, or <code>null</code> - * if this object does not represent a valid directory. - * - * @exception SecurityException If read access is not allowed to the - * directory by the <code>SecurityManager</code> - */ - public String[] list(FilenameFilter filter) - { - checkRead(); - return (String[]) performList (filter, null, String.class); - } - - /** - * This method returns a array of <code>String</code>'s representing the - * list of files is then directory represented by this object. If this - * object represents a non-directory file or a non-existent file, then - * <code>null</code> is returned. The list of files will not contain - * any names such as "." or ".." which indicate the current or parent - * directory. Also, the names are not guaranteed to be sorted. - * <p> - * A <code>SecurityManager</code> check is made prior to reading the - * directory. If read access to the directory is denied, an exception - * will be thrown. - * - * @return An array of files in the directory, or <code>null</code> if - * this object does not represent a valid directory. - * - * @exception SecurityException If read access is not allowed to the - * directory by the <code>SecurityManager</code> - */ - public String[] list() - { - checkRead(); - return (String[]) performList (null, null, String.class); - } - - /** - * This method returns an array of <code>File</code> objects representing - * all the files in the directory represented by this object. If this - * object does not represent a directory, <code>null</code> is returned. - * Each of the returned <code>File</code> object is constructed with this - * object as its parent. - * <p> - * A <code>SecurityManager</code> check is made prior to reading the - * directory. If read access to the directory is denied, an exception - * will be thrown. - * - * @return An array of <code>File</code> objects for this directory. - * - * @exception SecurityException If the <code>SecurityManager</code> denies - * access to this directory. - * - * @since 1.2 - */ - public File[] listFiles() - { - checkRead(); - return (File[]) performList (null, null, File.class); - } - - /** - * This method returns an array of <code>File</code> objects representing - * all the files in the directory represented by this object. If this - * object does not represent a directory, <code>null</code> is returned. - * Each of the returned <code>File</code> object is constructed with this - * object as its parent. - * <p> - * In this form of the <code>listFiles()</code> method, a filter is specified - * that allows the caller to control which files are returned in the - * list. The <code>FilenameFilter</code> specified is called for each - * file returned to determine whether or not that file should be included - * in the list. - * <p> - * A <code>SecurityManager</code> check is made prior to reading the - * directory. If read access to the directory is denied, an exception - * will be thrown. - * - * @return An array of <code>File</code> objects for this directory. - * - * @exception SecurityException If the <code>SecurityManager</code> denies - * access to this directory. - * - * @since 1.2 - */ - public File[] listFiles(FilenameFilter filter) - { - checkRead(); - return (File[]) performList (filter, null, File.class); - } - - /** - * This method returns an array of <code>File</code> objects representing - * all the files in the directory represented by this object. If this - * object does not represent a directory, <code>null</code> is returned. - * Each of the returned <code>File</code> object is constructed with this - * object as its parent. - * <p> - * In this form of the <code>listFiles()</code> method, a filter is specified - * that allows the caller to control which files are returned in the - * list. The <code>FileFilter</code> specified is called for each - * file returned to determine whether or not that file should be included - * in the list. - * <p> - * A <code>SecurityManager</code> check is made prior to reading the - * directory. If read access to the directory is denied, an exception - * will be thrown. - * - * @return An array of <code>File</code> objects for this directory. - * - * @exception SecurityException If the <code>SecurityManager</code> denies - * access to this directory. - * - * @since 1.2 - */ - public File[] listFiles(FileFilter filter) - { - checkRead(); - return (File[]) performList (null, filter, File.class); - } - - /** - * This method returns a <code>String</code> that is the path name of the - * file as returned by <code>getPath</code>. - * - * @return A <code>String</code> representation of this file - */ - public String toString() - { - return path; - } - - /** - * @return A <code>URI</code> for this object. - */ - public URI toURI() - { - String abspath = getAbsolutePath(); - - if (isDirectory()) - abspath = abspath + separator; - - try - { - return new URI("file", abspath.replace(separatorChar, '/'), null); - } - catch (URISyntaxException use) - { - // Can't happen. - throw new RuntimeException(use); - } - } - - /** - * This method returns a <code>URL</code> with the <code>file:</code> - * protocol that represents this file. The exact form of this URL is - * system dependent. - * - * @return A <code>URL</code> for this object. - * - * @exception MalformedURLException If the URL cannot be created - * successfully. - */ - public URL toURL() throws MalformedURLException - { - // On Win32, Sun's JDK returns URLs of the form "file:/c:/foo/bar.txt", - // while on UNIX, it returns URLs of the form "file:/foo/bar.txt". - if (separatorChar == '\\') - return new URL ("file:/" + getAbsolutePath().replace ('\\', '/') - + (isDirectory() ? "/" : "")); - else - return new URL ("file:" + getAbsolutePath() - + (isDirectory() ? "/" : "")); - } - - /* - * This native method actually creates the directory - */ - private final native boolean performMkdir(); - - /** - * This method creates a directory for the path represented by this object. - * - * @return <code>true</code> if the directory was created, - * <code>false</code> otherwise - * - * @exception SecurityException If write access is not allowed to this file - */ - public boolean mkdir() - { - checkWrite(); - return performMkdir(); - } - - private static boolean mkdirs (File x) - { - if (x.isDirectory()) - return true; - String p = x.getPath(); - String parent = x.getParent(); - if (parent != null) - { - x.path = parent; - if (! mkdirs (x)) - return false; - x.path = p; - } - return x.mkdir(); - } - - /** - * This method creates a directory for the path represented by this file. - * It will also create any intervening parent directories if necessary. - * - * @return <code>true</code> if the directory was created, - * <code>false</code> otherwise - * - * @exception SecurityException If write access is not allowed to this file - */ - public boolean mkdirs() - { - checkWrite(); - if (isDirectory()) - return false; - return mkdirs (new File (path)); - } - - private static synchronized String nextValue() - { - return Long.toString(counter++, Character.MAX_RADIX); - } - - /** - * This method creates a temporary file in the specified directory. If - * the directory name is null, then this method uses the system temporary - * directory. The files created are guaranteed not to currently exist and - * the same file name will never be used twice in the same virtual - * machine instance. - * The system temporary directory is determined by examinging the - * <code>java.io.tmpdir</code> system property. - * <p> - * The <code>prefix</code> parameter is a sequence of at least three - * characters that are used as the start of the generated filename. The - * <code>suffix</code> parameter is a sequence of characters that is used - * to terminate the file name. This parameter may be <code>null</code> - * and if it is, the suffix defaults to ".tmp". - * <p> - * If a <code>SecurityManager</code> exists, then its <code>checkWrite</code> - * method is used to verify that this operation is permitted. - * - * @param prefix The character prefix to use in generating the path name. - * @param suffix The character suffix to use in generating the path name. - * @param directory The directory to create the file in, or - * <code>null</code> for the default temporary directory - * - * @exception IllegalArgumentException If the patterns is not valid - * @exception SecurityException If there is no permission to perform - * this operation - * @exception IOException If an error occurs - * - * @since 1.2 - */ - public static File createTempFile(String prefix, String suffix, - File directory) - throws IOException - { - // Grab the system temp directory if necessary - if (directory == null) - { - String dirname = tmpdir; - if (dirname == null) - throw new IOException("Cannot determine system temporary directory"); - - directory = new File(dirname); - if (!directory.internalExists()) - throw new IOException("System temporary directory " - + directory.getName() + " does not exist."); - if (!directory.internalIsDirectory()) - throw new IOException("System temporary directory " - + directory.getName() - + " is not really a directory."); - } - - // Check if prefix is at least 3 characters long - if (prefix.length() < 3) - throw new IllegalArgumentException("Prefix too short: " + prefix); - - // Set default value of suffix - if (suffix == null) - suffix = ".tmp"; - - // Truncation rules. - // `6' is the number of characters we generate. - // If maxPathLen equals zero, then the system doesn't have a limit - // on the file name, so there is nothing to truncate. - if (maxPathLen > 0 && prefix.length() + 6 + suffix.length() > maxPathLen) - { - int suf_len = 0; - if (suffix.charAt(0) == '.') - suf_len = 4; - suffix = suffix.substring(0, suf_len); - if (prefix.length() + 6 + suf_len > maxPathLen) - prefix = prefix.substring(0, maxPathLen - 6 - suf_len); - } - - File f; - - // How many times should we try? We choose 100. - for (int i = 0; i < 100; ++i) - { - // This is ugly. - String t = "ZZZZZZ" + nextValue(); - String l = prefix + t.substring(t.length() - 6) + suffix; - try - { - f = new File(directory, l); - if (f.createNewFile()) - return f; - } - catch (IOException ignored) - { - } - } - - throw new IOException ("cannot create temporary file"); - } - - /* - * This native method sets file permissions. - */ - private native boolean setFilePermissions(boolean enable, boolean ownerOnly, - int permissions); - - /** - * This method sets the owner's read permission for the File represented by - * this object. - * - * It is the same as calling <code>setReadable(readable, true)</code>. - * - * @param <code>readable</code> <code>true</code> to set read permission, - * <code>false</code> to unset the read permission. - * @return <code>true</code> if the file permissions are changed, - * <code>false</code> otherwise. - * @exception SecurityException If write access of the file is not permitted. - * @see #setReadable(boolean, boolean) - * @since 1.6 - */ - public boolean setReadable(boolean readable) - { - return setReadable(readable, true); - } - - /** - * This method sets the read permissions for the File represented by - * this object. - * - * If <code>ownerOnly</code> is set to <code>true</code> then only the - * read permission bit for the owner of the file is changed. - * - * If <code>ownerOnly</code> is set to <code>false</code>, the file - * permissions are changed so that the file can be read by everyone. - * - * On unix like systems this sets the <code>user</code>, <code>group</code> - * and <code>other</code> read bits and is equal to call - * <code>chmod a+r</code> on the file. - * - * @param <code>readable</code> <code>true</code> to set read permission, - * <code>false</code> to unset the read permission. - * @param <code>ownerOnly</code> <code>true</code> to set read permission - * for owner only, <code>false</code> for all. - * @return <code>true</code> if the file permissions are changed, - * <code>false</code> otherwise. - * @exception SecurityException If write access of the file is not permitted. - * @see #setReadable(boolean) - * @since 1.6 - */ - public boolean setReadable(boolean readable, boolean ownerOnly) - { - checkWrite(); - return setFilePermissions(readable, ownerOnly, READ); - } - - /** - * This method sets the owner's write permission for the File represented by - * this object. - * - * It is the same as calling <code>setWritable(readable, true)</code>. - * - * @param <code>writable</code> <code>true</code> to set write permission, - * <code>false</code> to unset write permission. - * @return <code>true</code> if the file permissions are changed, - * <code>false</code> otherwise. - * @exception SecurityException If write access of the file is not permitted. - * @see #setWritable(boolean, boolean) - * @since 1.6 - */ - public boolean setWritable(boolean writable) - { - return setWritable(writable, true); - } - - /** - * This method sets the write permissions for the File represented by - * this object. - * - * If <code>ownerOnly</code> is set to <code>true</code> then only the - * write permission bit for the owner of the file is changed. - * - * If <code>ownerOnly</code> is set to <code>false</code>, the file - * permissions are changed so that the file can be written by everyone. - * - * On unix like systems this set the <code>user</code>, <code>group</code> - * and <code>other</code> write bits and is equal to call - * <code>chmod a+w</code> on the file. - * - * @param <code>writable</code> <code>true</code> to set write permission, - * <code>false</code> to unset write permission. - * @param <code>ownerOnly</code> <code>true</code> to set write permission - * for owner only, <code>false</code> for all. - * @return <code>true</code> if the file permissions are changed, - * <code>false</code> otherwise. - * @exception SecurityException If write access of the file is not permitted. - * @see #setWritable(boolean) - * @since 1.6 - */ - public boolean setWritable(boolean writable, boolean ownerOnly) - { - checkWrite(); - return setFilePermissions(writable, ownerOnly, WRITE); - } - - /** - * This method sets the owner's execute permission for the File represented - * by this object. - * - * It is the same as calling <code>setExecutable(readable, true)</code>. - * - * @param <code>executable</code> <code>true</code> to set execute permission, - * <code>false</code> to unset execute permission. - * @return <code>true</code> if the file permissions are changed, - * <code>false</code> otherwise. - * @exception SecurityException If write access of the file is not permitted. - * @see #setExecutable(boolean, boolean) - * @since 1.6 - */ - public boolean setExecutable(boolean executable) - { - return setExecutable(executable, true); - } - - /** - * This method sets the execute permissions for the File represented by - * this object. - * - * If <code>ownerOnly</code> is set to <code>true</code> then only the - * execute permission bit for the owner of the file is changed. - * - * If <code>ownerOnly</code> is set to <code>false</code>, the file - * permissions are changed so that the file can be executed by everyone. - * - * On unix like systems this set the <code>user</code>, <code>group</code> - * and <code>other</code> write bits and is equal to call - * <code>chmod a+x</code> on the file. - * - * @param <code>executable</code> <code>true</code> to set write permission, - * <code>false</code> to unset write permission. - * @param <code>ownerOnly</code> <code>true</code> to set write permission - * for owner only, <code>false</code> for all. - * @return <code>true</code> if the file permissions are changed, - * <code>false</code> otherwise. - * @exception SecurityException If write access of the file is not permitted. - * @see #setExecutable(boolean) - * @since 1.6 - */ - public boolean setExecutable(boolean executable, boolean ownerOnly) - { - checkWrite(); - return setFilePermissions(executable, ownerOnly, EXEC); - } - - /* - * This native method sets the permissions to make the file read only. - */ - private native boolean performSetReadOnly(); - - /** - * This method sets the file represented by this object to be read only. - * A read only file or directory cannot be modified. Please note that - * GNU systems allow read only files to be deleted if the directory it - * is contained in is writable. - * - * @return <code>true</code> if the operation succeeded, <code>false</code> - * otherwise. - * - * @exception SecurityException If the <code>SecurityManager</code> does - * not allow this operation. - * - * @since 1.2 - */ - public boolean setReadOnly() - { - // Do a security check before trying to do anything else. - checkWrite(); - return performSetReadOnly(); - } - - private static native File[] performListRoots(); - - /** - * This method returns an array of filesystem roots. Some operating systems - * have volume oriented filesystem. This method provides a mechanism for - * determining which volumes exist. GNU systems use a single hierarchical - * filesystem, so will have only one "/" filesystem root. - * - * @return An array of <code>File</code> objects for each filesystem root - * available. - * - * @since 1.2 - */ - public static File[] listRoots() - { - File[] roots = performListRoots(); - - SecurityManager s = System.getSecurityManager(); - if (s != null) - { - // Only return roots to which the security manager permits read access. - int count = roots.length; - for (int i = 0; i < roots.length; i++) - { - try - { - s.checkRead (roots[i].path); - } - catch (SecurityException sx) - { - roots[i] = null; - count--; - } - } - if (count != roots.length) - { - File[] newRoots = new File[count]; - int k = 0; - for (int i=0; i < roots.length; i++) - { - if (roots[i] != null) - newRoots[k++] = roots[i]; - } - roots = newRoots; - } - } - return roots; - } - - /** - * This method creates a temporary file in the system temporary directory. - * The files created are guaranteed not to currently exist and the same file - * name will never be used twice in the same virtual machine instance. The - * system temporary directory is determined by examinging the - * <code>java.io.tmpdir</code> system property. - * <p> - * The <code>prefix</code> parameter is a sequence of at least three - * characters that are used as the start of the generated filename. The - * <code>suffix</code> parameter is a sequence of characters that is used - * to terminate the file name. This parameter may be <code>null</code> - * and if it is, the suffix defaults to ".tmp". - * <p> - * If a <code>SecurityManager</code> exists, then its <code>checkWrite</code> - * method is used to verify that this operation is permitted. - * <p> - * This method is identical to calling - * <code>createTempFile(prefix, suffix, null)</code>. - * - * @param prefix The character prefix to use in generating the path name. - * @param suffix The character suffix to use in generating the path name. - * - * @exception IllegalArgumentException If the prefix or suffix are not valid. - * @exception SecurityException If there is no permission to perform - * this operation - * @exception IOException If an error occurs - */ - public static File createTempFile(String prefix, String suffix) - throws IOException - { - return createTempFile(prefix, suffix, null); - } - - /** - * This method compares the specified <code>File</code> to this one - * to test for equality. It does this by comparing the canonical path names - * of the files. - * <p> - * The canonical paths of the files are determined by calling the - * <code>getCanonicalPath</code> method on each object. - * <p> - * This method returns a 0 if the specified <code>Object</code> is equal - * to this one, a negative value if it is less than this one - * a positive value if it is greater than this one. - * - * @return An integer as described above - * - * @since 1.2 - */ - public int compareTo(File other) - { - if (caseSensitive) - return path.compareTo (other.path); - else - return path.compareToIgnoreCase (other.path); - } - - /* - * This native method actually performs the rename. - */ - private native boolean performRenameTo (File dest); - - /** - * This method renames the file represented by this object to the path - * of the file represented by the argument <code>File</code>. - * - * @param dest The <code>File</code> object representing the target name - * - * @return <code>true</code> if the rename succeeds, <code>false</code> - * otherwise. - * - * @exception SecurityException If write access is not allowed to the - * file by the <code>SecurityMananger</code>. - */ - public synchronized boolean renameTo(File dest) - { - SecurityManager s = System.getSecurityManager(); - if (s != null) - { - s.checkWrite (getPath()); - s.checkWrite (dest.getPath()); - } - return performRenameTo (dest); - } - - /* - * This method does the actual setting of the modification time. - */ - private native boolean performSetLastModified(long time); - - /** - * This method sets the modification time on the file to the specified - * value. This is specified as the number of seconds since midnight - * on January 1, 1970 GMT. - * - * @param time The desired modification time. - * - * @return <code>true</code> if the operation succeeded, <code>false</code> - * otherwise. - * - * @exception IllegalArgumentException If the specified time is negative. - * @exception SecurityException If the <code>SecurityManager</code> will - * not allow this operation. - * - * @since 1.2 - */ - public boolean setLastModified(long time) - { - if (time < 0) - throw new IllegalArgumentException("Negative modification time: " + time); - - checkWrite(); - return performSetLastModified(time); - } - - private void checkWrite() - { - // Check the SecurityManager - SecurityManager s = System.getSecurityManager(); - - if (s != null) - s.checkWrite(path); - } - - private void checkRead() - { - // Check the SecurityManager - SecurityManager s = System.getSecurityManager(); - - if (s != null) - s.checkRead(path); - } - - private void checkExec() - { - // Check the SecurityManager - SecurityManager s = System.getSecurityManager(); - - if (s != null) - s.checkExec(path); - } - - /** - * Calling this method requests that the file represented by this object - * be deleted when the virtual machine exits. Note that this request cannot - * be cancelled. Also, it will only be carried out if the virtual machine - * exits normally. - * - * @exception SecurityException If deleting of the file is not allowed - * - * @since 1.2 - */ - // FIXME: This should use the ShutdownHook API once we implement that. - public void deleteOnExit() - { - // Check the SecurityManager - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkDelete (getPath()); - - DeleteFileHelper.add(this); - } - - private void writeObject(ObjectOutputStream oos) throws IOException - { - oos.defaultWriteObject(); - oos.writeChar(separatorChar); - } - - private void readObject(ObjectInputStream ois) - throws ClassNotFoundException, IOException - { - ois.defaultReadObject(); - - // If the file was from an OS with a different dir separator, - // fixup the path to use the separator on this OS. - char oldSeparatorChar = ois.readChar(); - - if (oldSeparatorChar != separatorChar) - path = path.replace(oldSeparatorChar, separatorChar); - } - -} // class File - |