Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Methods](https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#pubmethods) \| [Inherited Methods](https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#inhmethods)

# SecureDirectoryStream


`
public


interface
SecureDirectoryStream
`


`


implements

https://developer.android.com/reference/java/nio/file/DirectoryStream<T>


`

|---|
| java.nio.file.SecureDirectoryStream\<T\> |

<br />

*** ** * ** ***

A `DirectoryStream` that defines operations on files that are located
relative to an open directory. A `SecureDirectoryStream` is intended
for use by sophisticated or security sensitive applications requiring to
traverse file trees or otherwise operate on directories in a race-free manner.
Race conditions can arise when a sequence of file operations cannot be
carried out in isolation. Each of the file operations defined by this
interface specify a relative path. All access to the file is relative
to the open directory irrespective of if the directory is moved or replaced
by an attacker while the directory is open. A `SecureDirectoryStream`
may also be used as a virtual *working directory*.

A `SecureDirectoryStream` requires corresponding support from the
underlying operating system. Where an implementation supports this features
then the `DirectoryStream` returned by the `https://developer.android.com/reference/java/nio/file/Files#newDirectoryStream(java.nio.file.Path)` method will be a `SecureDirectoryStream` and must
be cast to that type in order to invoke the methods defined by this interface.

In the case of the default `https://developer.android.com/reference/java/nio/file/spi/FileSystemProvider`, and a security manager is set, then the permission checks are
performed using the path obtained by resolving the given relative path
against the *original path* of the directory (irrespective of if the
directory is moved since it was opened).

## Summary

| ### Public methods ||
|---|---|
| ` abstract void` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#deleteDirectory(T)(T path) ` Deletes a directory. |
| ` abstract void` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#deleteFile(T)(T path) ` Deletes a file. |
| ` abstract <V extends https://developer.android.com/reference/java/nio/file/attribute/FileAttributeView> V` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#getFileAttributeView(java.lang.Class<V>)(https://developer.android.com/reference/java/lang/Class<V> type) ` Returns a new file attribute view to access the file attributes of this directory. |
| ` abstract <V extends https://developer.android.com/reference/java/nio/file/attribute/FileAttributeView> V` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#getFileAttributeView(T,%20java.lang.Class<V>,%20java.nio.file.LinkOption[])(T path, https://developer.android.com/reference/java/lang/Class<V> type, https://developer.android.com/reference/java/nio/file/LinkOption options) ` Returns a new file attribute view to access the file attributes of a file in this directory. |
| ` abstract void` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#move(T,%20java.nio.file.SecureDirectoryStream<T>,%20T)(T srcpath, https://developer.android.com/reference/java/nio/file/SecureDirectoryStream<T> targetdir, T targetpath) ` Move a file from this directory to another directory. |
| ` abstract https://developer.android.com/reference/java/nio/channels/SeekableByteChannel` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#newByteChannel(T,%20java.util.Set<?%20extends%20java.nio.file.OpenOption>,%20java.nio.file.attribute.FileAttribute<?>[])(T path, https://developer.android.com/reference/java/util/Set<? extends https://developer.android.com/reference/java/nio/file/OpenOption> options, https://developer.android.com/reference/java/nio/file/attribute/FileAttribute<?> attrs) ` Opens or creates a file in this directory, returning a seekable byte channel to access the file. |
| ` abstract https://developer.android.com/reference/java/nio/file/SecureDirectoryStream<T>` | ` https://developer.android.com/reference/java/nio/file/SecureDirectoryStream#newDirectoryStream(T,%20java.nio.file.LinkOption[])(T path, https://developer.android.com/reference/java/nio/file/LinkOption options) ` Opens the directory identified by the given path, returning a `SecureDirectoryStream` to iterate over the entries in the directory. |

| ### Inherited methods |
|---|---|
| From interface ` https://developer.android.com/reference/java/nio/file/DirectoryStream ` |---|---| | ` abstract https://developer.android.com/reference/java/util/Iterator<T>` | ` https://developer.android.com/reference/java/nio/file/DirectoryStream#iterator()() ` Returns the iterator associated with this `DirectoryStream`. | ||
| From interface ` https://developer.android.com/reference/java/io/Closeable ` |---|---| | ` abstract void` | ` https://developer.android.com/reference/java/io/Closeable#close()() ` Closes this stream and releases any system resources associated with it. | ||
| From interface ` https://developer.android.com/reference/java/lang/Iterable ` |---|---| | ` default void` | ` https://developer.android.com/reference/java/lang/Iterable#forEach(java.util.function.Consumer<?%20super%20T>)(https://developer.android.com/reference/java/util/function/Consumer<? super T> action) ` Performs the given action for each element of the `Iterable` until all elements have been processed or the action throws an exception. | | ` abstract https://developer.android.com/reference/java/util/Iterator<T>` | ` https://developer.android.com/reference/java/lang/Iterable#iterator()() ` Returns an iterator over elements of type `T`. | | ` default https://developer.android.com/reference/java/util/Spliterator<T>` | ` https://developer.android.com/reference/java/lang/Iterable#spliterator()() ` Creates a `https://developer.android.com/reference/java/util/Spliterator` over the elements described by this `Iterable`. | ||
| From interface ` https://developer.android.com/reference/java/lang/AutoCloseable ` |---|---| | ` abstract void` | ` https://developer.android.com/reference/java/lang/AutoCloseable#close()() ` Closes this resource, relinquishing any underlying resources. | ||

## Public methods

### deleteDirectory

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract void deleteDirectory (T path)
```

Deletes a directory.

Unlike the `https://developer.android.com/reference/java/nio/file/Files#delete(java.nio.file.Path)` method, this method
does not first examine the file to determine if the file is a directory.
Whether non-directories are deleted by this method is system dependent and
therefore not specified. When the parameter is a relative path then the
directory to delete is relative to this open directory.

<br />

| Parameters ||
|---|---|
| `path` | `T`: the path of the directory to delete <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/io/IOException` | if an I/O error occurs |
| `https://developer.android.com/reference/java/lang/SecurityException` | In the case of the default provider, and a security manager is installed, the `https://developer.android.com/reference/java/lang/SecurityManager#checkDelete(java.lang.String)` method is invoked to check delete access to the directory |
| `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException` | if the directory stream is closed |
| `https://developer.android.com/reference/java/nio/file/DirectoryNotEmptyException` | if the directory could not otherwise be deleted because it is not empty *(optional specific exception)* |
| `https://developer.android.com/reference/java/nio/file/NoSuchFileException` | if the directory does not exist *(optional specific exception)* |

### deleteFile

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract void deleteFile (T path)
```

Deletes a file.

Unlike the `https://developer.android.com/reference/java/nio/file/Files#delete(java.nio.file.Path)` method, this method does
not first examine the file to determine if the file is a directory.
Whether a directory is deleted by this method is system dependent and
therefore not specified. If the file is a symbolic link, then the link
itself, not the final target of the link, is deleted. When the
parameter is a relative path then the file to delete is relative to
this open directory.

<br />

| Parameters ||
|---|---|
| `path` | `T`: the path of the file to delete <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/io/IOException` | if an I/O error occurs |
| `https://developer.android.com/reference/java/lang/SecurityException` | In the case of the default provider, and a security manager is installed, the `https://developer.android.com/reference/java/lang/SecurityManager#checkDelete(java.lang.String)` method is invoked to check delete access to the file |
| `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException` | if the directory stream is closed |
| `https://developer.android.com/reference/java/nio/file/NoSuchFileException` | if the file does not exist *(optional specific exception)* |

### getFileAttributeView

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract V getFileAttributeView (Class<V> type)
```

Returns a new file attribute view to access the file attributes of this
directory.

The resulting file attribute view can be used to read or update the
attributes of this (open) directory. The `type` parameter specifies
the type of the attribute view and the method returns an instance of that
type if supported. Invoking this method to obtain a `https://developer.android.com/reference/java/nio/file/attribute/BasicFileAttributeView` always returns an instance of that class that is
bound to this open directory.

The state of resulting file attribute view is intimately connected
to this directory stream. Once the directory stream is `https://developer.android.com/reference/java/io/Closeable#close()`,
then all methods to read or update attributes will throw `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException`.

<br />

| Parameters ||
|---|---|
| `type` | `Class`: the `Class` object corresponding to the file attribute view <br /> |

| Returns ||
|---|---|
| `V` | a new file attribute view of the specified type bound to this directory stream, or `null` if the attribute view type is not available <br /> |

### getFileAttributeView

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract V getFileAttributeView (T path, 
                Class<V> type, 
                LinkOption... options)
```

Returns a new file attribute view to access the file attributes of a file
in this directory.

The resulting file attribute view can be used to read or update the
attributes of file in this directory. The `type` parameter specifies
the type of the attribute view and the method returns an instance of that
type if supported. Invoking this method to obtain a `https://developer.android.com/reference/java/nio/file/attribute/BasicFileAttributeView` always returns an instance of that class that is
bound to the file in the directory.

The state of resulting file attribute view is intimately connected
to this directory stream. Once the directory stream `https://developer.android.com/reference/java/io/Closeable#close()`,
then all methods to read or update attributes will throw `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException`. The
file is not required to exist at the time that the file attribute view
is created but methods to read or update attributes of the file will
fail when invoked and the file does not exist.

<br />

| Parameters ||
|---|---|
| `path` | `T`: the path of the file <br /> |
| `type` | `Class`: the `Class` object corresponding to the file attribute view <br /> |
| `options` | `LinkOption`: options indicating how symbolic links are handled <br /> |

| Returns ||
|---|---|
| `V` | a new file attribute view of the specified type bound to a this directory stream, or `null` if the attribute view type is not available <br /> |

### move

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract void move (T srcpath, 
                SecureDirectoryStream<T> targetdir, 
                T targetpath)
```

Move a file from this directory to another directory.

This method works in a similar manner to `https://developer.android.com/reference/java/nio/file/Files#move(java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption[])`
method when the `https://developer.android.com/reference/java/nio/file/StandardCopyOption#ATOMIC_MOVE` option
is specified. That is, this method moves a file as an atomic file system
operation. If the `srcpath` parameter is an `https://developer.android.com/reference/java/nio/file/Path#isAbsolute()` path then it locates the source file. If the parameter is a
relative path then it is located relative to this open directory. If
the `targetpath` parameter is absolute then it locates the target
file (the `targetdir` parameter is ignored). If the parameter is
a relative path it is located relative to the open directory identified
by the `targetdir` parameter. In all cases, if the target file
exists then it is implementation specific if it is replaced or this
method fails.

<br />

| Parameters ||
|---|---|
| `srcpath` | `T`: the name of the file to move <br /> |
| `targetdir` | `SecureDirectoryStream`: the destination directory <br /> |
| `targetpath` | `T`: the name to give the file in the destination directory <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/io/IOException` | if an I/O error occurs |
| `https://developer.android.com/reference/java/lang/SecurityException` | In the case of the default provider, and a security manager is installed, the `https://developer.android.com/reference/java/lang/SecurityManager#checkWrite(java.lang.String)` method is invoked to check write access to both the source and target file. |
| `https://developer.android.com/reference/java/nio/file/AtomicMoveNotSupportedException` | if the file cannot be moved as an atomic file system operation |
| `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException` | if this or the target directory stream is closed |
| `https://developer.android.com/reference/java/nio/file/FileAlreadyExistsException` | if the file already exists in the target directory and cannot be replaced *(optional specific exception)* |

### newByteChannel

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract SeekableByteChannel newByteChannel (T path, 
                Set<? extends OpenOption> options, 
                FileAttribute...<?> attrs)
```

Opens or creates a file in this directory, returning a seekable byte
channel to access the file.

This method works in exactly the manner specified by the `https://developer.android.com/reference/java/nio/file/Files#newByteChannel(java.nio.file.Path,%20java.nio.file.OpenOption[])` method for the
case that the `path` parameter is an `https://developer.android.com/reference/java/nio/file/Path#isAbsolute()`
path. When the parameter is a relative path then the file to open or
create is relative to this open directory. In addition to the options
defined by the `Files.newByteChannel` method, the `https://developer.android.com/reference/java/nio/file/LinkOption#NOFOLLOW_LINKS` option may be used to
ensure that this method fails if the file is a symbolic link.

The channel, once created, is not dependent upon the directory stream
used to create it. Closing this directory stream has no effect upon the
channel.

<br />

| Parameters ||
|---|---|
| `path` | `T`: the path of the file to open or create <br /> |
| `options` | `Set`: options specifying how the file is opened <br /> |
| `attrs` | `FileAttribute`: an optional list of attributes to set atomically when creating the file <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/nio/channels/SeekableByteChannel` | the seekable byte channel <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/io/IOException` | if an I/O error occurs |
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if the set contains an invalid combination of options |
| `https://developer.android.com/reference/java/lang/SecurityException` | In the case of the default provider, and a security manager is installed, the `https://developer.android.com/reference/java/lang/SecurityManager#checkRead(java.lang.String)` method is invoked to check read access to the path if the file is opened for reading. The `https://developer.android.com/reference/java/lang/SecurityManager#checkWrite(java.lang.String)` method is invoked to check write access to the path if the file is opened for writing. |
| `https://developer.android.com/reference/java/lang/UnsupportedOperationException` | if an unsupported open option is specified or the array contains attributes that cannot be set atomically when creating the file |
| `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException` | if the directory stream is closed |
| `https://developer.android.com/reference/java/nio/file/FileAlreadyExistsException` | if a file of that name already exists and the `https://developer.android.com/reference/java/nio/file/StandardOpenOption#CREATE_NEW` option is specified *(optional specific exception)* |

### newDirectoryStream

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract SecureDirectoryStream<T> newDirectoryStream (T path, 
                LinkOption... options)
```

Opens the directory identified by the given path, returning a `SecureDirectoryStream` to iterate over the entries in the directory.

This method works in exactly the manner specified by the `https://developer.android.com/reference/java/nio/file/Files#newDirectoryStream(java.nio.file.Path)` method for the case that
the `path` parameter is an `https://developer.android.com/reference/java/nio/file/Path#isAbsolute()` path.
When the parameter is a relative path then the directory to open is
relative to this open directory. The `https://developer.android.com/reference/java/nio/file/LinkOption#NOFOLLOW_LINKS` option may be used to
ensure that this method fails if the file is a symbolic link.

The new directory stream, once created, is not dependent upon the
directory stream used to create it. Closing this directory stream has no
effect upon newly created directory stream.

<br />

| Parameters ||
|---|---|
| `path` | `T`: the path to the directory to open <br /> |
| `options` | `LinkOption`: options indicating how symbolic links are handled <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/nio/file/SecureDirectoryStream<T>` | a new and open `SecureDirectoryStream` object <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/io/IOException` | if an I/O error occurs |
| `https://developer.android.com/reference/java/lang/SecurityException` | In the case of the default provider, and a security manager is installed, the `https://developer.android.com/reference/java/lang/SecurityManager#checkRead(java.lang.String)` method is invoked to check read access to the directory. |
| `https://developer.android.com/reference/java/nio/file/ClosedDirectoryStreamException` | if the directory stream is closed |
| `https://developer.android.com/reference/java/nio/file/NotDirectoryException` | if the file could not otherwise be opened because it is not a directory *(optional specific exception)* |