1 /* 2 * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.io; 27 28 29 /** 30 * Package-private abstract class for the local filesystem abstraction. 31 */ 32 33 abstract class FileSystem { 34 35 /** 36 * Return the FileSystem object representing this platform's local 37 * filesystem. 38 */ 39 public static native FileSystem getFileSystem(); 40 41 42 /* -- Normalization and construction -- */ 43 44 /** 45 * Return the local filesystem's name-separator character. 46 */ 47 public abstract char getSeparator(); 48 49 /** 50 * Return the local filesystem's path-separator character. 51 */ 52 public abstract char getPathSeparator(); 53 54 /** 55 * Convert the given pathname string to normal form. If the string is 56 * already in normal form then it is simply returned. 57 */ 58 public abstract String normalize(String path); 59 60 /** 61 * Compute the length of this pathname string's prefix. The pathname 62 * string must be in normal form. 63 */ 64 public abstract int prefixLength(String path); 65 66 /** 67 * Resolve the child pathname string against the parent. 68 * Both strings must be in normal form, and the result 69 * will be in normal form. 70 */ 71 public abstract String resolve(String parent, String child); 72 73 /** 74 * Return the parent pathname string to be used when the parent-directory 75 * argument in one of the two-argument File constructors is the empty 76 * pathname. 77 */ 78 public abstract String getDefaultParent(); 79 80 /** 81 * Post-process the given URI path string if necessary. This is used on 82 * win32, e.g., to transform "/c:/foo" into "c:/foo". The path string 83 * still has slash separators; code in the File class will translate them 84 * after this method returns. 85 */ 86 public abstract String fromURIPath(String path); 87 88 89 /* -- Path operations -- */ 90 91 /** 92 * Tell whether or not the given abstract pathname is absolute. 93 */ 94 public abstract boolean isAbsolute(File f); 95 96 /** 97 * Resolve the given abstract pathname into absolute form. Invoked by the 98 * getAbsolutePath and getCanonicalPath methods in the File class. 99 */ 100 public abstract String resolve(File f); 101 102 public abstract String canonicalize(String path) throws IOException; 103 104 105 /* -- Attribute accessors -- */ 106 107 /* Constants for simple boolean attributes */ 108 public static final int BA_EXISTS = 0x01; 109 public static final int BA_REGULAR = 0x02; 110 public static final int BA_DIRECTORY = 0x04; 111 public static final int BA_HIDDEN = 0x08; 112 113 /** 114 * Return the simple boolean attributes for the file or directory denoted 115 * by the given abstract pathname, or zero if it does not exist or some 116 * other I/O error occurs. 117 */ 118 public abstract int getBooleanAttributes(File f); 119 120 public static final int ACCESS_READ = 0x04; 121 public static final int ACCESS_WRITE = 0x02; 122 public static final int ACCESS_EXECUTE = 0x01; 123 124 /** 125 * Check whether the file or directory denoted by the given abstract 126 * pathname may be accessed by this process. The second argument specifies 127 * which access, ACCESS_READ, ACCESS_WRITE or ACCESS_EXECUTE, to check. 128 * Return false if access is denied or an I/O error occurs 129 */ 130 public abstract boolean checkAccess(File f, int access); 131 /** 132 * Set on or off the access permission (to owner only or to all) to the file 133 * or directory denoted by the given abstract pathname, based on the parameters 134 * enable, access and oweronly. 135 */ 136 public abstract boolean setPermission(File f, int access, boolean enable, boolean owneronly); 137 138 /** 139 * Return the time at which the file or directory denoted by the given 140 * abstract pathname was last modified, or zero if it does not exist or 141 * some other I/O error occurs. 142 */ 143 public abstract long getLastModifiedTime(File f); 144 145 /** 146 * Return the length in bytes of the file denoted by the given abstract 147 * pathname, or zero if it does not exist, is a directory, or some other 148 * I/O error occurs. 149 */ 150 public abstract long getLength(File f); 151 152 153 /* -- File operations -- */ 154 155 /** 156 * Create a new empty file with the given pathname. Return 157 * <code>true</code> if the file was created and <code>false</code> if a 158 * file or directory with the given pathname already exists. Throw an 159 * IOException if an I/O error occurs. 160 */ 161 public abstract boolean createFileExclusively(String pathname) 162 throws IOException; 163 164 /** 165 * Delete the file or directory denoted by the given abstract pathname, 166 * returning <code>true</code> if and only if the operation succeeds. 167 */ 168 public abstract boolean delete(File f); 169 170 /** 171 * List the elements of the directory denoted by the given abstract 172 * pathname. Return an array of strings naming the elements of the 173 * directory if successful; otherwise, return <code>null</code>. 174 */ 175 public abstract String[] list(File f); 176 177 /** 178 * Create a new directory denoted by the given abstract pathname, 179 * returning <code>true</code> if and only if the operation succeeds. 180 */ 181 public abstract boolean createDirectory(File f); 182 183 /** 184 * Rename the file or directory denoted by the first abstract pathname to 185 * the second abstract pathname, returning <code>true</code> if and only if 186 * the operation succeeds. 187 */ 188 public abstract boolean rename(File f1, File f2); 189 190 /** 191 * Set the last-modified time of the file or directory denoted by the 192 * given abstract pathname, returning <code>true</code> if and only if the 193 * operation succeeds. 194 */ 195 public abstract boolean setLastModifiedTime(File f, long time); 196 197 /** 198 * Mark the file or directory denoted by the given abstract pathname as 199 * read-only, returning <code>true</code> if and only if the operation 200 * succeeds. 201 */ 202 public abstract boolean setReadOnly(File f); 203 204 205 /* -- Filesystem interface -- */ 206 207 /** 208 * List the available filesystem roots. 209 */ 210 public abstract File[] listRoots(); 211 212 /* -- Disk usage -- */ 213 public static final int SPACE_TOTAL = 0; 214 public static final int SPACE_FREE = 1; 215 public static final int SPACE_USABLE = 2; 216 217 public abstract long getSpace(File f, int t); 218 219 /* -- Basic infrastructure -- */ 220 221 /** 222 * Compare two abstract pathnames lexicographically. 223 */ 224 public abstract int compare(File f1, File f2); 225 226 /** 227 * Compute the hash code of an abstract pathname. 228 */ 229 public abstract int hashCode(File f); 230 231 // Flags for enabling/disabling performance optimizations for file 232 // name canonicalization 233 static boolean useCanonCaches = true; 234 static boolean useCanonPrefixCache = true; 235 236 private static boolean getBooleanProperty(String prop, boolean defaultVal) { 237 String val = System.getProperty(prop); 238 if (val == null) return defaultVal; 239 if (val.equalsIgnoreCase("true")) { 240 return true; 241 } else { 242 return false; 243 } 244 } 245 246 static { 247 useCanonCaches = getBooleanProperty("sun.io.useCanonCaches", 248 useCanonCaches); 249 useCanonPrefixCache = getBooleanProperty("sun.io.useCanonPrefixCache", 250 useCanonPrefixCache); 251 } 252 }