/* * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.nio.file; import java.nio.file.attribute.*; import java.nio.channels.SeekableByteChannel; import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.util.Iterator; import java.util.Set; /** * A file reference that locates a file using a system dependent path. The file * is not required to exist. * *

On many platforms a path is the means to locate and access files * in a file system. A path is hierarchical and composed of a sequence of * directory and file name elements separated by a special separator or * delimiter. * *

Path operations

* *

A system dependent path represented by this class is conceptually a * sequence of name elements and optionally a root component. The name * that is farthest from the root of the directory hierarchy is the * name of a file or directory. The other elements are directory names. The root * component typically identifies a file system hierarchy. A {@code Path} can * represent a root, a root and a sequence of names, or simply one or more name * elements. It defines the {@link #getName() getName}, {@link #getParent * getParent}, {@link #getRoot getRoot}, and {@link #subpath subpath} methods * to access the components or a subsequence of its name elements. * *

In addition to accessing the components of a path, a {@code Path} also * defines {@link #resolve(Path) resolve} and {@link #relativize relativize} * operations. Paths can also be {@link #compareTo compared}, and tested * against each other using using the {@link #startsWith startsWith} and {@link * #endsWith endWith} methods. * *

File operations

* *

A {@code Path} is either absolute or relative. An * absolute path is complete in that does not need to be combined with another * path in order to locate a file. All operations on relative paths are first * resolved against a file system's default directory as if by invoking the * {@link #toAbsolutePath toAbsolutePath} method. * *

In addition to the operations defined by the {@link FileRef} interface, * this class defines the following operations: * *

* *

This class implements {@link Watchable} interface so that a directory * located by a path can be {@link #register registered} with a {@link WatchService}. * and entries in the directory watched. * *

File attributes

* * In addition to the {@link #setAttribute setAttribute} and {@link #getAttribute * getAttribute} methods, the {@code * java.nio.file.attribute} package provides type-safe and efficient access * to file attributes or meta-data associated with files. The {@link * Attributes Attributes} class defines methods that operate on or return file * attributes. For example, the file type, size, timestamps, and other * basic meta-data are obtained, in bulk, by invoking the {@link * Attributes#readBasicFileAttributes Attributes.readBasicFileAttributes} method: *
 *     Path file = ...
 *     BasicFileAttributes attrs = Attributes.readBasicFileAttributes(file);
 * 
* *

Interoperability

* *

Paths created by file systems associated with the default {@link * java.nio.file.spi.FileSystemProvider provider} are generally interoperable * with the {@link java.io.File java.io.File} class. Paths created by other * providers are unlikely to be interoperable with the abstract path names * represented by {@code java.io.File}. The {@link java.io.File#toPath * File.toPath} method may be used to obtain a {@code Path} from the abstract * path name represented by a {@code java.io.File java.io.File} object. The * resulting {@code Path} can be used to operate on the same file as the {@code * java.io.File} object. * *

Path objects created by file systems associated with the default * provider are interoperable with objects created by other file systems created * by the same provider. Path objects created by file systems associated with * other providers may not be interoperable with other file systems created by * the same provider. The reasons for this are provider specific. * *

Concurrency

* *

Instances of this class are immutable and safe for use by multiple concurrent * threads. * * @since 1.7 */ public abstract class Path implements FileRef, Comparable, Iterable, Watchable { /** * Initializes a new instance of this class. */ protected Path() { } /** * Returns the file system that created this object. * * @return the file system that created this object */ public abstract FileSystem getFileSystem(); /** * Tells whether or not this path is absolute. * *

An absolute path is complete in that it doesn't need to be * combined with other path information in order to locate a file. * * @return {@code true} if, and only if, this path is absolute */ public abstract boolean isAbsolute(); /** * Returns the root component of this path as a {@code Path} object, * or {@code null} if this path does not have a root component. * * @return a path representing the root component of this path, * or {@code null} */ public abstract Path getRoot(); /** * Returns the name of the file or directory denoted by this path. The * file name is the farthest element from the root in the directory * hierarchy. * * @return a path representing the name of the file or directory, or * {@code null} if this path has zero elements */ public abstract Path getName(); /** * Returns the parent path, or {@code null} if this path does not * have a parent. * *

The parent of this path object consists of this path's root * component, if any, and each element in the path except for the * farthest from the root in the directory hierarchy. This method * does not access the file system; the path or its parent may not exist. * Furthermore, this method does not eliminate special names such as "." * and ".." that may be used in some implementations. On UNIX for example, * the parent of "{@code /a/b/c}" is "{@code /a/b}", and the parent of * {@code "x/y/.}" is "{@code x/y}". This method may be used with the {@link * #normalize normalize} method, to eliminate redundant names, for cases where * shell-like navigation is required. * *

If this path has one or more elements, and no root component, then * this method is equivalent to evaluating the expression: *

     * subpath(0, getNameCount()-1);
     * 
* * @return a path representing the path's parent */ public abstract Path getParent(); /** * Returns the number of name elements in the path. * * @return the number of elements in the path, or {@code 0} if this path * only represents a root component */ public abstract int getNameCount(); /** * Returns a name element of this path. * *

The {@code index} parameter is the index of the name element to return. * The element that is closest to the root in the directory hierarchy * has index {@code 0}. The element that is farthest from the root * has index {@link #getNameCount count}{@code -1}. * * @param index * the index of the element * * @return the name element * * @throws IllegalArgumentException * if {@code index} is negative, {@code index} is greater than or * equal to the number of elements, or this path has zero name * elements */ public abstract Path getName(int index); /** * Returns a relative {@code Path} that is a subsequence of the name * elements of this path. * *

The {@code beginIndex} and {@code endIndex} parameters specify the * subsequence of name elements. The name that is closest to the root * in the directory hierarchy has index {@code 0}. The name that is * farthest from the root has index {@link #getNameCount * count}{@code -1}. The returned {@code Path} object has the name elements * that begin at {@code beginIndex} and extend to the element at index {@code * endIndex-1}. * * @param beginIndex * the index of the first element, inclusive * @param endIndex * the index of the last element, exclusive * * @return a new {@code Path} object that is a subsequence of the name * elements in this {@code Path} * * @throws IllegalArgumentException * if {@code beginIndex} is negative, or greater than or equal to * the number of elements. If {@code endIndex} is less than or * equal to {@code beginIndex}, or larger than the number of elements. */ public abstract Path subpath(int beginIndex, int endIndex); /** * Tests if this path starts with the given path. * *

This path starts with the given path if this path's root * component starts with the root component of the given path, * and this path starts with the same name elements as the given path. * If the given path has more name elements than this path then {@code false} * is returned. * *

Whether or not the root component of this path starts with the root * component of the given path is file system specific. If this path does * not have a root component and the given path has a root component then * this path does not start with the given path. * * @param other * the given path * * @return {@code true} if this path starts with the given path; otherwise * {@code false} */ public abstract boolean startsWith(Path other); /** * Tests if this path ends with the given path. * *

If the given path has N elements, and no root component, * and this path has N or more elements, then this path ends with * the given path if the last N elements of each path, starting at * the element farthest from the root, are equal. * *

If the given path has a root component then this path ends with the * given path if the root component of this path ends with the root * component of the given path, and the corresponding elements of both paths * are equal. Whether or not the root component of this path ends with the * root component of the given path is file system specific. If this path * does not have a root component and the given path has a root component * then this path does not end with the given path. * * @param other * the given path * * @return {@code true} if this path ends with the given path; otherwise * {@code false} */ public abstract boolean endsWith(Path other); /** * Returns a path that is this path with redundant name elements eliminated. * *

The precise definition of this method is implementation dependent but * in general it derives from this path, a path that does not contain * redundant name elements. In many file systems, the "{@code .}" * and "{@code ..}" are special names used to indicate the current directory * and parent directory. In such file systems all occurrences of "{@code .}" * are considered redundant. If a "{@code ..}" is preceded by a * non-"{@code ..}" name then both names are considered redundant (the * process to identify such names is repeated until is it no longer * applicable). * *

This method does not access the file system; the path may not locate * a file that exists. Eliminating "{@code ..}" and a preceding name from a * path may result in the path that locates a different file than the original * path. This can arise when the preceding name is a symbolic link. * * @return the resulting path, or this path if it does not contain * redundant name elements, or {@code null} if this path does not * have a root component and all name elements are redundant * * @see #getParent * @see #toRealPath */ public abstract Path normalize(); // -- resolution and relativization -- /** * Resolve the given path against this path. * *

If the {@code other} parameter is an {@link #isAbsolute() absolute} * path then this method trivially returns {@code other}. If {@code other} * is {@code null} then this path is returned. Otherwise this method * considers this path to be a directory and resolves the given path * against this path. In the simplest case, the given path does not have * a {@link #getRoot root} component, in which case this method joins * the given path to this path and returns a resulting path that {@link * #endsWith ends} with the given path. Where the given path has a root * component then resolution is highly implementation dependent and therefore * unspecified. * * @param other * the path to resolve against this path; can be {@code null} * * @return the resulting path * * @see #relativize */ public abstract Path resolve(Path other); /** * Converts a given path string to a {@code Path} and resolves it against * this {@code Path} in exactly the manner specified by the {@link * #resolve(Path) resolve} method. * * @param other * the path string to resolve against this path * * @return the resulting path * * @throws InvalidPathException * If the path string cannot be converted to a Path. * * @see FileSystem#getPath */ public abstract Path resolve(String other); /** * Constructs a relative path between this path and a given path. * *

Relativization is the inverse of {@link #resolve(Path) resolution}. * This method attempts to construct a {@link #isAbsolute relative} path * that when {@link #resolve(Path) resolved} against this path, yields a * path that locates the same file as the given path. For example, on UNIX, * if this path is {@code "/a/b"} and the given path is {@code "/a/b/c/d"} * then the resulting relative path would be {@code "c/d"}. Where this * path and the given path do not have a {@link #getRoot root} component, * then a relative path can be constructed. A relative path cannot be * constructed if only one of the paths have a root component. Where both * paths have a root component then it is implementation dependent if a * relative path can be constructed. If this path and the given path are * {@link #equals equal} then {@code null} is returned. * *

For any two paths p and q, where q does not have * a root component, *

* p.relativize(p.resolve(q)).equals(q) *
* *

When symbolic links are supported, then whether the resulting path, * when resolved against this path, yields a path that can be used to locate * the {@link #isSameFile same} file as {@code other} is implementation * dependent. For example, if this path is {@code "/a/b"} and the given * path is {@code "/a/x"} then the resulting relative path may be {@code * "../x"}. If {@code "b"} is a symbolic link then is implementation * dependent if {@code "a/b/../x"} would locate the same file as {@code "/a/x"}. * * @param other * the path to relativize against this path * * @return the resulting relative path, or {@code null} if both paths are * equal * * @throws IllegalArgumentException * if {@code other} is not a {@code Path} that can be relativized * against this path */ public abstract Path relativize(Path other); // -- file operations -- /** * Deletes the file located by this path. * *

An implementation may require to examine the file to determine if the * file is a directory. Consequently this method may not be atomic with respect * to other file system operations. If the file is a symbolic link then the * symbolic link itself, not the final target of the link, is deleted. * *

If the file is a directory then the directory must be empty. In some * implementations a directory has entries for special files or links that * are created when the directory is created. In such implementations a * directory is considered empty when only the special entries exist. * *

On some operating systems it may not be possible to remove a file when * it is open and in use by this Java virtual machine or other programs. * * @throws NoSuchFileException * if the file does not exist (optional specific exception) * @throws DirectoryNotEmptyException * if the file is a directory and could not otherwise be deleted * because the directory is not empty (optional specific * exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkDelete(String)} method * is invoked to check delete access to the file */ public abstract void delete() throws IOException; /** * Deletes the file located by this path, if it exists. * *

As with the {@link #delete delete()} method, an implementation may * need to examine the file to determine if the file is a directory. * Consequently this method may not be atomic with respect to other file * system operations. If the file is a symbolic link, then the symbolic * link itself, not the final target of the link, is deleted. * *

If the file is a directory then the directory must be empty. In some * implementations a directory has entries for special files or links that * are created when the directory is created. In such implementations a * directory is considered empty when only the special entries exist. * *

On some operating systems it may not be possible to remove a file when * it is open and in use by this Java virtual machine or other programs. * * @throws DirectoryNotEmptyException * if the file is a directory and could not otherwise be deleted * because the directory is not empty (optional specific * exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkDelete(String)} method * is invoked to check delete access to the file. */ public abstract void deleteIfExists() throws IOException; /** * Creates a symbolic link to a target (optional operation). * *

The {@code target} parameter is the target of the link. It may be an * {@link Path#isAbsolute absolute} or relative path and may not exist. When * the target is a relative path then file system operations on the resulting * link are relative to the path of the link. * *

The {@code attrs} parameter is an optional array of {@link FileAttribute * attributes} to set atomically when creating the link. Each attribute is * identified by its {@link FileAttribute#name name}. If more than one attribute * of the same name is included in the array then all but the last occurrence * is ignored. * *

Where symbolic links are supported, but the underlying {@link FileStore} * does not support symbolic links, then this may fail with an {@link * IOException}. Additionally, some operating systems may require that the * Java virtual machine be started with implementation specific privileges to * create symbolic links, in which case this method may throw {@code IOException}. * * @param target * the target of the symbolic link * @param attrs * the array of attributes to set atomically when creating the * symbolic link * * @return this path * * @throws UnsupportedOperationException * if the implementation does not support symbolic links or the * array contains an attribute that cannot be set atomically when * creating the symbolic link * @throws FileAlreadyExistsException * if a file with the name already exists (optional specific * exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager * is installed, it denies {@link LinkPermission}("symbolic") * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to the path of the symbolic link. */ public abstract Path createSymbolicLink(Path target, FileAttribute... attrs) throws IOException; /** * Creates a new link (directory entry) for an existing file (optional * operation). * *

This path locates the directory entry to create. The {@code existing} * parameter is the path to an existing file. This method creates a new * directory entry for the file so that it can be accessed using this path. * On some file systems this is known as creating a "hard link". Whether the * file attributes are maintained for the file or for each directory entry * is file system specific and therefore not specified. Typically, a file * system requires that all links (directory entries) for a file be on the * same file system. Furthermore, on some platforms, the Java virtual machine * may require to be started with implementation specific privileges to * create hard links or to create links to directories. * * @param existing * a reference to an existing file * * @return this path * * @throws UnsupportedOperationException * if the implementation does not support adding an existing file * to a directory * @throws FileAlreadyExistsException * if the entry could not otherwise be created because a file of * that name already exists (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager * is installed, it denies {@link LinkPermission}("hard") * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to both this path and the path of the * existing file. */ public abstract Path createLink(Path existing) throws IOException; /** * Reads the target of a symbolic link (optional operation). * *

If the file system supports symbolic * links then this method is used to read the target of the link, failing * if the file is not a symbolic link. The target of the link need not exist. * The returned {@code Path} object will be associated with the same file * system as this {@code Path}. * * @return a {@code Path} object representing the target of the link * * @throws UnsupportedOperationException * if the implementation does not support symbolic links * @throws NotLinkException * if the target could otherwise not be read because the file * is not a symbolic link (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager * is installed, it checks that {@code FilePermission} has been * granted with the "{@code readlink}" action to read the link. */ public abstract Path readSymbolicLink() throws IOException; /** * Returns a URI to represent this path. * *

This method constructs a hierarchical {@link URI} that is absolute * with a non-empty path component. Its {@link URI#getScheme() scheme} is * equal to the URI scheme that identifies the provider. The exact form of * the other URI components is highly provider dependent. In particular, it * is implementation dependent if its query, fragment, and authority * components are defined or undefined. * *

For the default provider the {@link URI#getPath() path} component * will represent the {@link #toAbsolutePath absolute} path; the query, * fragment components are undefined. Whether the authority component is * defined or not is implementation dependent. There is no guarantee that * the {@code URI} may be used to construct a {@link java.io.File java.io.File}. * In particular, if this path represents a Universal Naming Convention (UNC) * path, then the UNC server name may be encoded in the authority component * of the resulting URI. In the case of the default provider, and the file * exists, and it can be determined that the file is a directory, then the * resulting {@code URI} will end with a slash. * *

The default provider provides a similar round-trip guarantee * to the {@link java.io.File} class. For a given {@code Path} p it * is guaranteed that *

* {@link Paths#get(URI) Paths.get}(p.toUri()).equals(p * .{@link #toAbsolutePath() toAbsolutePath}()) *
* so long as the original {@code Path}, the {@code URI}, and the new {@code * Path} are all created in (possibly different invocations of) the same * Java virtual machine. Whether other providers make any guarantees is * provider specific and therefore unspecified. * *

When a file system is constructed to access the contents of a file * as a file system then it is highly implementation specific if the returned * URI represents the given path in the file system or it represents a * compound URI that encodes the URI of the enclosing file system. * A format for compound URIs is not defined in this release; such a scheme * may be added in a future release. * * @return an absolute, hierarchical URI with a non-empty path component * * @throws java.io.IOError * if an I/O error occurs obtaining the absolute path, or where a * file system is constructed to access the contents of a file as * a file system, and the URI of the enclosing file system cannot be * obtained * * @throws SecurityException * In the case of the default provider, and a security manager * is installed, the {@link #toAbsolutePath toAbsolutePath} method * throws a security exception. */ public abstract URI toUri(); /** * Returns a {@code Path} object representing the absolute path of this * path. * *

If this path is already {@link Path#isAbsolute absolute} then this * method simply returns this path. Otherwise, this method resolves the path * in an implementation dependent manner, typically by resolving the path * against a file system default directory. Depending on the implementation, * this method may throw an I/O error if the file system is not accessible. * * @return a {@code Path} object representing the absolute path * * @throws IOError * if an I/O error occurs * @throws SecurityException * In the case of the default provider, a security manager * is installed, and this path is not absolute, then the security * manager's {@link SecurityManager#checkPropertyAccess(String) * checkPropertyAccess} method is invoked to check access to the * system property {@code user.dir} */ public abstract Path toAbsolutePath(); /** * Returns the real path of an existing file. * *

The precise definition of this method is implementation dependent but * in general it derives from this path, an {@link #isAbsolute absolute} * path that locates the {@link #isSameFile same} file as this path, but * with name elements that represent the actual name of the directories * and the file. For example, where filename comparisons on a file system * are case insensitive then the name elements represent the names in their * actual case. Additionally, the resulting path has redundant name * elements removed. * *

If this path is relative then its absolute path is first obtained, * as if by invoking the {@link #toAbsolutePath toAbsolutePath} method. * *

The {@code resolveLinks} parameter specifies if symbolic links * should be resolved. This parameter is ignored when symbolic links are * not supported. Where supported, and the parameter has the value {@code * true} then symbolic links are resolved to their final target. Where the * parameter has the value {@code false} then this method does not resolve * symbolic links. Some implementations allow special names such as * "{@code ..}" to refer to the parent directory. When deriving the real * path, and a "{@code ..}" (or equivalent) is preceded by a * non-"{@code ..}" name then an implementation will typically causes both * names to be removed. When not resolving symbolic links and the preceding * name is a symbolic link then the names are only removed if it guaranteed * that the resulting path will locate the same file as this path. * * @return an absolute path represent the real path of the file * located by this object * * @throws IOException * if the file does not exist or an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager * is installed, its {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file, and where * this path is not absolute, its {@link SecurityManager#checkPropertyAccess(String) * checkPropertyAccess} method is invoked to check access to the * system property {@code user.dir} */ public abstract Path toRealPath(boolean resolveLinks) throws IOException; /** * Copy the file located by this path to a target location. * *

This method copies the file located by this {@code Path} to the * target location with the {@code options} parameter specifying how the * copy is performed. By default, the copy fails if the target file already * exists, except if the source and target are the {@link #isSameFile same} * file, in which case this method has no effect. File attributes are not * required to be copied to the target file. If symbolic links are supported, * and the file is a symbolic link, then the final target of the link is copied. * If the file is a directory then it creates an empty directory in the target * location (entries in the directory are not copied). This method can be * used with the {@link Files#walkFileTree Files.walkFileTree} utility * method to copy a directory and all entries in the directory, or an entire * file-tree where required. * *

The {@code options} parameter is an array of options and may contain * any of the following: * * * * * * * * * * * * * * * *
Option Description
{@link StandardCopyOption#REPLACE_EXISTING REPLACE_EXISTING} If the target file exists, then the target file is replaced if it * is not a non-empty directory. If the target file exists and is a * symbolic link, then the symbolic link itself, not the target of * the link, is replaced.
{@link StandardCopyOption#COPY_ATTRIBUTES COPY_ATTRIBUTES} Attempts to copy the file attributes associated with this file to * the target file. The exact file attributes that are copied is platform * and file system dependent and therefore unspecified. Minimally, the * {@link BasicFileAttributes#lastModifiedTime last-modified-time} is * copied to the target file if supported by both the source and target * file store. Copying of file timestamps may result in precision * loss.
{@link LinkOption#NOFOLLOW_LINKS NOFOLLOW_LINKS} Symbolic links are not followed. If the file, located by this path, * is a symbolic link, then the symbolic link itself, not the target of * the link, is copied. It is implementation specific if file attributes * can be copied to the new link. In other words, the {@code * COPY_ATTRIBUTES} option may be ignored when copying a symbolic link.
* *

An implementation of this interface may support additional * implementation specific options. * *

Copying a file is not an atomic operation. If an {@link IOException} * is thrown then it possible that the target file is incomplete or some of * its file attributes have not been copied from the source file. When the * {@code REPLACE_EXISTING} option is specified and the target file exists, * then the target file is replaced. The check for the existence of the file * and the creation of the new file may not be atomic with respect to other * file system activities. * * @param target * the target location * @param options * options specifying how the copy should be done * * @return the target * * @throws UnsupportedOperationException * if the array contains a copy option that is not supported * @throws FileAlreadyExistsException * if the target file exists and cannot be replaced because the * {@code REPLACE_EXISTING} option is not specified, or the target * file is a non-empty directory (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the source file, the * {@link SecurityManager#checkWrite(String) checkWrite} is invoked * to check write access to the target file. If a symbolic link is * copied the security manager is invoked to check {@link * LinkPermission}{@code ("symbolic")}. */ public abstract Path copyTo(Path target, CopyOption... options) throws IOException; /** * Move or rename the file located by this path to a target location. * *

By default, this method attempts to move the file to the target * location, failing if the target file exists except if the source and * target are the {@link #isSameFile same} file, in which case this method * has no effect. If the file is a symbolic link then the symbolic link * itself, not the target of the link, is moved. This method may be * invoked to move an empty directory. In some implementations a directory * has entries for special files or links that are created when the * directory is created. In such implementations a directory is considered * empty when only the special entries exist. When invoked to move a * directory that is not empty then the directory is moved if it does not * require moving the entries in the directory. For example, renaming a * directory on the same {@link FileStore} will usually not require moving * the entries in the directory. When moving a directory requires that its * entries be moved then this method fails (by throwing an {@code * IOException}). To move a file tree may involve copying rather * than moving directories and this can be done using the {@link * #copyTo copyTo} method in conjunction with the {@link * Files#walkFileTree Files.walkFileTree} utility method. * *

The {@code options} parameter is an array of options and may contain * any of the following: * * * * * * * * * * *
Option Description
{@link StandardCopyOption#REPLACE_EXISTING REPLACE_EXISTING} If the target file exists, then the target file is replaced if it * is not a non-empty directory. If the target file exists and is a * symbolic link, then the symbolic link itself, not the target of * the link, is replaced.
{@link StandardCopyOption#ATOMIC_MOVE ATOMIC_MOVE} The move is performed as an atomic file system operation and all * other options are ignored. If the target file exists then it is * implementation specific if the existing file is replaced or this method * fails by throwing an {@link IOException}. If the move cannot be * performed as an atomic file system operation then {@link * AtomicMoveNotSupportedException} is thrown. This can arise, for * example, when the target location is on a different {@code FileStore} * and would require that the file be copied, or target location is * associated with a different provider to this object.
* *

An implementation of this interface may support additional * implementation specific options. * *

Where the move requires that the file be copied then the {@link * BasicFileAttributes#lastModifiedTime last-modified-time} is copied to the * new file. An implementation may also attempt to copy other file * attributes but is not required to fail if the file attributes cannot be * copied. When the move is performed as a non-atomic operation, and a {@code * IOException} is thrown, then the state of the files is not defined. The * original file and the target file may both exist, the target file may be * incomplete or some of its file attributes may not been copied from the * original file. * * @param target * the target location * @param options * options specifying how the move should be done * * @return the target * * @throws UnsupportedOperationException * if the array contains a copy option that is not supported * @throws FileAlreadyExistsException * if the target file exists and cannot be replaced because the * {@code REPLACE_EXISTING} option is not specified, or the target * file is a non-empty directory * @throws AtomicMoveNotSupportedException * if the options array contains the {@code ATOMIC_MOVE} option but * the file cannot be moved as an atomic file system operation. * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkWrite(String) checkWrite} * method is invoked to check write access to both the source and * target file. */ public abstract Path moveTo(Path target, CopyOption... options) throws IOException; /** * Opens the directory referenced by this object, returning a {@code * DirectoryStream} to iterate over all entries in the directory. The * elements returned by the directory stream's {@link DirectoryStream#iterator * iterator} are of type {@code Path}, each one representing an entry in the * directory. The {@code Path} objects are obtained as if by {@link * #resolve(Path) resolving} the name of the directory entry against this * path. * *

The directory stream's {@code close} method should be invoked after * iteration is completed so as to free any resources held for the open * directory. * *

When an implementation supports operations on entries in the * directory that execute in a race-free manner then the returned directory * stream is a {@link SecureDirectoryStream}. * * @return a new and open {@code DirectoryStream} object * * @throws NotDirectoryException * if the file could not otherwise be opened because it is not * a directory (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the directory. */ public abstract DirectoryStream newDirectoryStream() throws IOException; /** * Opens the directory referenced by this object, returning a {@code * DirectoryStream} to iterate over the entries in the directory. The * elements returned by the directory stream's {@link DirectoryStream#iterator * iterator} are of type {@code Path}, each one representing an entry in the * directory. The {@code Path} objects are obtained as if by {@link * #resolve(Path) resolving} the name of the directory entry against this * path. The entries returned by the iterator are filtered by matching the * {@code String} representation of their file names against the given * globbing pattern. * *

For example, suppose we want to iterate over the files ending with * ".java" in a directory: *

     *     Path dir = ...
     *     DirectoryStream<Path> stream = dir.newDirectoryStream("*.java");
     * 
* *

The globbing pattern is specified by the {@link * FileSystem#getPathMatcher getPathMatcher} method. * *

The directory stream's {@code close} method should be invoked after * iteration is completed so as to free any resources held for the open * directory. * *

When an implementation supports operations on entries in the * directory that execute in a race-free manner then the returned directory * stream is a {@link SecureDirectoryStream}. * * @param glob * the glob pattern * * @return a new and open {@code DirectoryStream} object * * @throws java.util.regex.PatternSyntaxException * if the pattern is invalid * @throws NotDirectoryException * if the file could not otherwise be opened because it is not * a directory (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the directory. */ public abstract DirectoryStream newDirectoryStream(String glob) throws IOException; /** * Opens the directory referenced by this object, returning a {@code * DirectoryStream} to iterate over the entries in the directory. The * elements returned by the directory stream's {@link DirectoryStream#iterator * iterator} are of type {@code Path}, each one representing an entry in the * directory. The {@code Path} objects are obtained as if by {@link * #resolve(Path) resolving} the name of the directory entry against this * path. The entries returned by the iterator are filtered by the given * {@link DirectoryStream.Filter filter}. * *

The directory stream's {@code close} method should be invoked after * iteration is completed so as to free any resources held for the open * directory. * *

Where the filter terminates due to an uncaught error or runtime * exception then it is propogated to the iterator's {@link Iterator#hasNext() * hasNext} or {@link Iterator#next() next} method. Where an {@code * IOException} is thrown, it is propogated as a {@link * java.util.ConcurrentModificationException} with the {@code * IOException} as the cause. * *

When an implementation supports operations on entries in the * directory that execute in a race-free manner then the returned directory * stream is a {@link SecureDirectoryStream}. * *

Usage Example: * Suppose we want to iterate over the files in a directory that are * larger than 8K. *

     *     DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
     *         public boolean accept(Path file) throws IOException {
     *             long size = Attributes.readBasicFileAttributes(file).size();
     *             return (size > 8192L);
     *         }
     *     };
     *     Path dir = ...
     *     DirectoryStream<Path> stream = dir.newDirectoryStream(filter);
     * 
* @param filter * the directory stream filter * * @return a new and open {@code DirectoryStream} object * * @throws NotDirectoryException * if the file could not otherwise be opened because it is not * a directory (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the directory. */ public abstract DirectoryStream newDirectoryStream(DirectoryStream.Filter filter) throws IOException; /** * Creates a new and empty file, failing if the file already exists. * *

This {@code Path} locates the file to create. The check for the * existence of the file and the creation of the new file if it does not * exist are a single operation that is atomic with respect to all other * filesystem activities that might affect the directory. * *

The {@code attrs} parameter is an optional array of {@link FileAttribute * file-attributes} to set atomically when creating the file. Each attribute * is identified by its {@link FileAttribute#name name}. If more than one * attribute of the same name is included in the array then all but the last * occurrence is ignored. * * @param attrs * an optional list of file attributes to set atomically when * creating the file * * @return this path * * @throws UnsupportedOperationException * if the array contains an attribute that cannot be set atomically * when creating the file * @throws FileAlreadyExistsException * if a file of that name already exists * (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkWrite(String) checkWrite} * method is invoked to check write access to the new file. */ public abstract Path createFile(FileAttribute... attrs) throws IOException; /** * Creates a new directory. * *

This {@code Path} locates the directory to create. The check for the * existence of the file and the creation of the directory if it does not * exist are a single operation that is atomic with respect to all other * filesystem activities that might affect the directory. * *

The {@code attrs} parameter is an optional array of {@link FileAttribute * file-attributes} to set atomically when creating the directory. Each * file attribute is identified by its {@link FileAttribute#name name}. If * more than one attribute of the same name is included in the array then all * but the last occurrence is ignored. * * @param attrs * an optional list of file attributes to set atomically when * creating the directory * * @return this path * * @throws UnsupportedOperationException * if the array contains an attribute that cannot be set atomically * when creating the directory * @throws FileAlreadyExistsException * if a directory could not otherwise be created because a file of * that name already exists (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkWrite(String) checkWrite} * method is invoked to check write access to the new directory. * * @see Files#createDirectories */ public abstract Path createDirectory(FileAttribute... attrs) throws IOException; /** * Opens or creates a file, returning a seekable byte channel to access the * file. * *

The {@code options} parameter determines how the file is opened. * The {@link StandardOpenOption#READ READ} and {@link StandardOpenOption#WRITE WRITE} * options determine if the file should be opened for reading and/or writing. * If neither option (or the {@link StandardOpenOption#APPEND APPEND} * option) is contained in the array then the file is opened for reading. * By default reading or writing commences at the beginning of the file. * *

In the addition to {@code READ} and {@code WRITE}, the following * options may be present: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Option Description
{@link StandardOpenOption#APPEND APPEND} If this option is present then the file is opened for writing and * each invocation of the channel's {@code write} method first advances * the position to the end of the file and then writes the requested * data. Whether the advancement of the position and the writing of the * data are done in a single atomic operation is system-dependent and * therefore unspecified. This option may not be used in conjunction * with the {@code READ} or {@code TRUNCATE_EXISTING} options.
{@link StandardOpenOption#TRUNCATE_EXISTING TRUNCATE_EXISTING} If this option is present then the existing file is truncated to * a size of 0 bytes. This option is ignored when the file is opened only * for reading.
{@link StandardOpenOption#CREATE_NEW CREATE_NEW} If this option is present then a new file is created, failing if * the file already exists or is a symbolic link. When creating a file the * check for the existence of the file and the creation of the file if it * does not exist is atomic with respect to other file system operations. * This option is ignored when the file is opened only for reading.
{@link StandardOpenOption#CREATE CREATE} If this option is present then an existing file is opened if it * exists, otherwise a new file is created. This option is ignored if the * {@code CREATE_NEW} option is also present or the file is opened only * for reading.
{@link StandardOpenOption#DELETE_ON_CLOSE DELETE_ON_CLOSE} When this option is present then the implementation makes a * best effort attempt to delete the file when closed by the * {@link SeekableByteChannel#close close} method. If the {@code close} * method is not invoked then a best effort attempt is made to * delete the file when the Java virtual machine terminates.
{@link StandardOpenOption#SPARSE SPARSE} When creating a new file this option is a hint that the * new file will be sparse. This option is ignored when not creating * a new file.
{@link StandardOpenOption#SYNC SYNC} Requires that every update to the file's content or metadata be * written synchronously to the underlying storage device. (see Synchronized I/O file * integrity).
{@link StandardOpenOption#DSYNC DSYNC} Requires that every update to the file's content be written * synchronously to the underlying storage device. (see Synchronized I/O file * integrity).
* *

An implementation may also support additional implementation specific * options. * *

The {@code attrs} parameter is an optional array of file {@link * FileAttribute file-attributes} to set atomically when a new file is created. * *

In the case of the default provider, the returned seekable byte channel * is a {@link java.nio.channels.FileChannel}. * *

Usage Examples: *

     *     Path file = ...
     *
     *     // open file for reading
     *     ReadableByteChannel rbc = file.newByteChannel(EnumSet.of(READ)));
     *
     *     // open file for writing to the end of an existing file, creating
     *     // the file if it doesn't already exist
     *     WritableByteChannel wbc = file.newByteChannel(EnumSet.of(CREATE,APPEND));
     *
     *     // create file with initial permissions, opening it for both reading and writing
     *     FileAttribute<Set<PosixFilePermission>> perms = ...
     *     SeekableByteChannel sbc = file.newByteChannel(EnumSet.of(CREATE_NEW,READ,WRITE), perms);
     * 
* * @param options * Options specifying how the file is opened * @param attrs * An optional list of file attributes to set atomically when * creating the file * * @return a new seekable byte channel * * @throws IllegalArgumentException * if the set contains an invalid combination of options * @throws UnsupportedOperationException * if an unsupported open option is specified or the array contains * attributes that cannot be set atomically when creating the file * @throws FileAlreadyExistsException * if a file of that name already exists and the {@link * StandardOpenOption#CREATE_NEW CREATE_NEW} option is specified * (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the path if the file is * opened for reading. The {@link SecurityManager#checkWrite(String) * checkWrite} method is invoked to check write access to the path * if the file is opened for writing. */ public abstract SeekableByteChannel newByteChannel(Set options, FileAttribute... attrs) throws IOException; /** * Opens or creates a file, returning a seekable byte channel to access the * file. * *

This method opens or creates a file in exactly the manner specified * by the {@link Path#newByteChannel(Set,FileAttribute[]) newByteChannel} * method. * * @param options * options specifying how the file is opened * * @return a new seekable byte channel * * @throws IllegalArgumentException * if the set contains an invalid combination of options * @throws UnsupportedOperationException * if an unsupported open option is specified * @throws FileAlreadyExistsException * if a file of that name already exists and the {@link * StandardOpenOption#CREATE_NEW CREATE_NEW} option is specified * (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the path if the file is * opened for reading. The {@link SecurityManager#checkWrite(String) * checkWrite} method is invoked to check write access to the path * if the file is opened for writing. */ public abstract SeekableByteChannel newByteChannel(OpenOption... options) throws IOException; /** * Opens or creates the file located by this object for writing, returning * an output stream to write bytes to the file. * *

This method opens or creates a file in exactly the manner specified * by the {@link Path#newByteChannel(Set,FileAttribute[]) newByteChannel} * method except that the {@link StandardOpenOption#READ READ} option may not * be present in the array of open options. * * @param options * options specifying how the file is opened * * @return a new output stream * * @throws IllegalArgumentException {@inheritDoc} * @throws UnsupportedOperationException {@inheritDoc} * @throws IOException {@inheritDoc} * @throws SecurityException {@inheritDoc} */ @Override public abstract OutputStream newOutputStream(OpenOption... options) throws IOException; /** * Tells whether or not the file located by this object is considered * hidden. The exact definition of hidden is platform or provider * dependent. On UNIX for example a file is considered to be hidden if its * name begins with a period character ('.'). On Windows a file is * considered hidden if it isn't a directory and the DOS {@link * DosFileAttributes#isHidden hidden} attribute is set. * *

Depending on the implementation this method may require to access * the file system to determine if the file is considered hidden. * * @return {@code true} if the file is considered hidden * * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file. */ public abstract boolean isHidden() throws IOException; /** * Checks the existence and optionally the accessibility of the file * located by this path. * *

This method checks the existence of a file and that this Java virtual * machine has appropriate privileges that would allow it access the file * according to all of access modes specified in the {@code modes} parameter * as follows: * * * * * * * * * * * * * * * *
Value Description
{@link AccessMode#READ READ} Checks that the file exists and that the Java virtual machine has * permission to read the file.
{@link AccessMode#WRITE WRITE} Checks that the file exists and that the Java virtual machine has * permission to write to the file,
{@link AccessMode#EXECUTE EXECUTE} Checks that the file exists and that the Java virtual machine has * permission to {@link Runtime#exec execute} the file. The semantics * may differ when checking access to a directory. For example, on UNIX * systems, checking for {@code EXECUTE} access checks that the Java * virtual machine has permission to search the directory in order to * access file or subdirectories.
* *

If the {@code modes} parameter is of length zero, then the existence * of the file is checked. * *

This method follows symbolic links if the file referenced by this * object is a symbolic link. Depending on the implementation, this method * may require to read file permissions, access control lists, or other * file attributes in order to check the effective access to the file. To * determine the effective access to a file may require access to several * attributes and so in some implementations this method may not be atomic * with respect to other file system operations. Furthermore, as the result * of this method is immediately outdated, there is no guarantee that a * subsequence access will succeed (or even that it will access the same * file). Care should be taken when using this method in security sensitive * applications. * * @param modes * The access modes to check; may have zero elements * * @throws UnsupportedOperationException * an implementation is required to support checking for * {@code READ}, {@code WRITE}, and {@code EXECUTE} access. This * exception is specified to allow for the {@code Access} enum to * be extended in future releases. * @throws NoSuchFileException * if a file does not exist (optional specific exception) * @throws AccessDeniedException * the requested access would be denied or the access cannot be * determined because the Java virtual machine has insufficient * privileges or other reasons. (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * is invoked when checking read access to the file or only the * existence of the file, the {@link SecurityManager#checkWrite(String) * checkWrite} is invoked when checking write access to the file, * and {@link SecurityManager#checkExec(String) checkExec} is invoked * when checking execute access. */ public abstract void checkAccess(AccessMode... modes) throws IOException; /** * Tests whether the file located by this path exists. * *

This convenience method is intended for cases where it is required to * take action when it can be confirmed that a file exists. This method simply * invokes the {@link #checkAccess checkAccess} method to check if the file * exists. If the {@code checkAccess} method succeeds then this method returns * {@code true}, otherwise if an {@code IOException} is thrown (because the * file doesn't exist or cannot be accessed by this Java virtual machine) * then {@code false} is returned. * *

Note that the result of this method is immediately outdated. If this * method indicates the file exists then there is no guarantee that a * subsequence access will succeed. Care should be taken when using this * method in security sensitive applications. * * @return {@code true} if the file exists; {@code false} if the file does * not exist or its existence cannot be determined. * * @throws SecurityException * In the case of the default provider, the {@link * SecurityManager#checkRead(String)} is invoked to check * read access to the file. * * @see #notExists */ public abstract boolean exists(); /** * Tests whether the file located by this path does not exist. * *

This convenience method is intended for cases where it is required to * take action when it can be confirmed that a file does not exist. This * method invokes the {@link #checkAccess checkAccess} method to check if the * file exists. If the file does not exist then {@code true} is returned, * otherwise the file exists or cannot be accessed by this Java virtual * machine and {@code false} is returned. * *

Note that this method is not the complement of the {@link #exists * exists} method. Where it is not possible to determine if a file exists * or not then both methods return {@code false}. As with the {@code exists} * method, the result of this method is immediately outdated. If this * method indicates the file does exist then there is no guarantee that a * subsequence attempt to create the file will succeed. Care should be taken * when using this method in security sensitive applications. * * @return {@code true} if the file does not exist; {@code false} if the * file exists or its existence cannot be determined. * * @throws SecurityException * In the case of the default provider, the {@link * SecurityManager#checkRead(String)} is invoked to check * read access to the file. */ public abstract boolean notExists(); /** * Returns the {@link FileStore} representing the file store where an * existing file, located by this path, is stored. * *

Once a reference to the {@code FileStore} is obtained it is * implementation specific if operations on the returned {@code FileStore}, * or {@link FileStoreAttributeView} objects obtained from it, continue * to depend on the existence of the file. In particular the behavior is not * defined for the case that the file is deleted or moved to a different * file store. * * @return the file store where the file is stored * * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file, and in * addition it checks {@link RuntimePermission} * ("getFileStoreAttributes") */ public abstract FileStore getFileStore() throws IOException; // -- watchable -- /** * Registers the file located by this path with a watch service. * *

In this release, this path locates a directory that exists. The * directory is registered with the watch service so that entries in the * directory can be watched. The {@code events} parameter is an array of * events to register and may contain the following events: *

* *

The {@link WatchEvent#context context} for these events is the * relative path between the directory located by this path, and the path * that locates the directory entry that is created, deleted, or modified. * *

The set of events may include additional implementation specific * event that are not defined by the enum {@link StandardWatchEventKind} * *

The {@code modifiers} parameter is an array of modifiers * that qualify how the directory is registered. This release does not * define any standard modifiers. The array may contain * implementation specific modifiers. * *

Where a file is registered with a watch service by means of a symbolic * link then it is implementation specific if the watch continues to depend * on the existence of the symbolic link after it is registered. * * @param watcher * the watch service to which this object is to be registered * @param events * the events for which this object should be registered * @param modifiers * the modifiers, if any, that modify how the object is registered * * @return a key representing the registration of this object with the * given watch service * * @throws UnsupportedOperationException * if unsupported events or modifiers are specified * @throws IllegalArgumentException * if an invalid combination of events or modifiers is specified * @throws ClosedWatchServiceException * if the watch service is closed * @throws NotDirectoryException * if the file is registered to watch the entries in a directory * and the file is not a directory (optional specific exception) * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file. */ @Override public abstract WatchKey register(WatchService watcher, WatchEvent.Kind[] events, WatchEvent.Modifier... modifiers) throws IOException; /** * Registers the file located by this path with a watch service. * *

An invocation of this method behaves in exactly the same way as the * invocation *

     *     watchable.{@link #register(WatchService,WatchEvent.Kind[],WatchEvent.Modifier[]) register}(watcher, events, new WatchEvent.Modifier[0]);
     * 
* *

Usage Example: * Suppose we wish to register a directory for entry create, delete, and modify * events: *

     *     Path dir = ...
     *     WatchService watcher = ...
     *
     *     WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
     * 
* @param watcher * The watch service to which this object is to be registered * @param events * The events for which this object should be registered * * @return A key representing the registration of this object with the * given watch service * * @throws UnsupportedOperationException * If unsupported events are specified * @throws IllegalArgumentException * If an invalid combination of events is specified * @throws ClosedWatchServiceException * If the watch service is closed * @throws NotDirectoryException * If the file is registered to watch the entries in a directory * and the file is not a directory (optional specific exception) * @throws IOException * If an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file. */ @Override public abstract WatchKey register(WatchService watcher, WatchEvent.Kind... events) throws IOException; // -- Iterable -- /** * Returns an iterator over the name elements of this path. * *

The first element returned by the iterator represents the name * element that is closest to the root in the directory hierarchy, the * second element is the next closest, and so on. The last element returned * is the name of the file or directory denoted by this path. The {@link * #getRoot root} component, if present, is not returned by the iterator. * * @return an iterator over the name elements of this path. */ @Override public abstract Iterator iterator(); // -- compareTo/equals/hashCode -- /** * Compares two abstract paths lexicographically. The ordering defined by * this method is provider specific, and in the case of the default * provider, platform specific. This method does not access the file system * and neither file is required to exist. * * @param other the path compared to this path. * * @return zero if the argument is {@link #equals equal} to this path, a * value less than zero if this path is lexicographically less than * the argument, or a value greater than zero if this path is * lexicographically greater than the argument */ @Override public abstract int compareTo(Path other); /** * Tests if the file referenced by this object is the same file referenced * by another object. * *

If this {@code Path} and the given {@code Path} are {@link * #equals(Object) equal} then this method returns {@code true} without checking * if the file exists. If the {@code Path} and the given {@code Path} * are associated with different providers, or the given {@code Path} is * {@code null} then this method returns {@code false}. Otherwise, this method * checks if both {@code Paths} locate the same file, and depending on the * implementation, may require to open or access both files. * *

If the file system and files remain static, then this method implements * an equivalence relation for non-null {@code Paths}. *

* * @param other * the other file reference * * @return {@code true} if, and only if, this object and the given object * locate the same file * * @throws IOException * if an I/O error occurs * @throws SecurityException * In the case of the default provider, and a security manager is * installed, the {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to both files. * * @see java.nio.file.attribute.BasicFileAttributes#fileKey */ public abstract boolean isSameFile(Path other) throws IOException; /** * Tests this path for equality with the given object. * *

If the given object is not a Path, or is a Path associated with a * different provider, then this method immediately returns {@code false}. * *

Whether or not two path are equal depends on the file system * implementation. In some cases the paths are compared without regard * to case, and others are case sensitive. This method does not access the * file system and the file is not required to exist. * *

This method satisfies the general contract of the {@link * java.lang.Object#equals(Object) Object.equals} method.

* * @param other * the object to which this object is to be compared * * @return {@code true} if, and only if, the given object is a {@code Path} * that is identical to this {@code Path} */ @Override public abstract boolean equals(Object other); /** * Computes a hash code for this path. * *

The hash code is based upon the components of the path, and * satisfies the general contract of the {@link Object#hashCode * Object.hashCode} method. * * @return the hash-code value for this path */ @Override public abstract int hashCode(); /** * Returns the string representation of this path. * *

If this path was created by converting a path string using the * {@link FileSystem#getPath getPath} method then the path string returned * by this method may differ from the original String used to create the path. * *

The returned path string uses the default name {@link * FileSystem#getSeparator separator} to separate names in the path. * * @return the string representation of this path */ @Override public abstract String toString(); }