Class ParcelFileDescriptor
- java.lang.Object
-
- android.os.ParcelFileDescriptor
-
- All Implemented Interfaces:
Parcelable,Closeable,AutoCloseable
public class ParcelFileDescriptor extends Object implements Parcelable, Closeable
The FileDescriptor returned byParcel.readFileDescriptor(), allowing you to close it when done with it.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classParcelFileDescriptor.AutoCloseInputStreamAn InputStream you can create on a ParcelFileDescriptor, which will take care of callingParcelFileDescriptor.close()for you when the stream is closed.static classParcelFileDescriptor.AutoCloseOutputStreamAn OutputStream you can create on a ParcelFileDescriptor, which will take care of callingParcelFileDescriptor.close()for you when the stream is closed.static classParcelFileDescriptor.FileDescriptorDetachedExceptionException that indicates that the file descriptor was detached.static interfaceParcelFileDescriptor.OnCloseListenerCallback indicating that a ParcelFileDescriptor has been closed.-
Nested classes/interfaces inherited from interface android.os.Parcelable
Parcelable.ClassLoaderCreator<T>, Parcelable.Creator<T>
-
-
Field Summary
Fields Modifier and Type Field Description static Parcelable.Creator<ParcelFileDescriptor>CREATORstatic intMODE_APPENDFor use withopen(java.io.File, int): append to end of file while writing.static intMODE_CREATEFor use withopen(java.io.File, int): create the file if it doesn't already exist.static intMODE_READ_ONLYFor use withopen(java.io.File, int): open the file with read-only access.static intMODE_READ_WRITEFor use withopen(java.io.File, int): open the file with read and write access.static intMODE_TRUNCATEFor use withopen(java.io.File, int): erase contents of file when opening.static intMODE_WORLD_READABLEDeprecated.Creating world-readable files is very dangerous, and likely to cause security holes in applications.static intMODE_WORLD_WRITEABLEDeprecated.Creating world-writable files is very dangerous, and likely to cause security holes in applications.static intMODE_WRITE_ONLYFor use withopen(java.io.File, int): open the file with write-only access.-
Fields inherited from interface android.os.Parcelable
CONTENTS_FILE_DESCRIPTOR, PARCELABLE_WRITE_RETURN_VALUE
-
-
Constructor Summary
Constructors Constructor Description ParcelFileDescriptor(ParcelFileDescriptor wrapped)Create a new ParcelFileDescriptor wrapped around another descriptor.ParcelFileDescriptor(FileDescriptor fd)ParcelFileDescriptor(FileDescriptor fd, FileDescriptor commChannel)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static ParcelFileDescriptoradoptFd(int fd)Take ownership of a raw native fd in to a new ParcelFileDescriptor.booleancanDetectErrors()Indicates if this ParcelFileDescriptor can communicate and detect remote errors/crashes.voidcheckError()Detect and throw if the other end of a pipe or socket pair encountered an error or crashed.voidclose()Close the ParcelFileDescriptor.voidcloseWithError(String msg)Close the ParcelFileDescriptor, informing any peer that an error occurred while processing.static ParcelFileDescriptor[]createPipe()Create two ParcelFileDescriptors structured as a data pipe.static ParcelFileDescriptor[]createReliablePipe()Create two ParcelFileDescriptors structured as a data pipe.static ParcelFileDescriptor[]createReliableSocketPair()Create two ParcelFileDescriptors structured as a pair of sockets connected to each other.static ParcelFileDescriptor[]createReliableSocketPair(int type)static ParcelFileDescriptor[]createSocketPair()Create two ParcelFileDescriptors structured as a pair of sockets connected to each other.static ParcelFileDescriptor[]createSocketPair(int type)intdescribeContents()Describe the kinds of special objects contained in this Parcelable's marshalled representation.intdetachFd()Return the native fd int for this ParcelFileDescriptor and detach it from the object here.ParcelFileDescriptordup()Create a new ParcelFileDescriptor that is a dup of the existing FileDescriptor.static ParcelFileDescriptordup(FileDescriptor orig)Create a new ParcelFileDescriptor that is a dup of an existing FileDescriptor.protected voidfinalize()Invoked when the garbage collector has detected that this instance is no longer reachable.static ParcelFileDescriptorfromData(byte[] data, String name)Deprecated.static ParcelFileDescriptorfromDatagramSocket(DatagramSocket datagramSocket)Create a new ParcelFileDescriptor from the specified DatagramSocket.static ParcelFileDescriptorfromFd(int fd)Create a new ParcelFileDescriptor from a raw native fd.static ParcelFileDescriptorfromSocket(Socket socket)Create a new ParcelFileDescriptor from the specified Socket.intgetFd()Return the native fd int for this ParcelFileDescriptor.FileDescriptorgetFileDescriptor()Retrieve the actual FileDescriptor associated with this object.longgetStatSize()Return the total size of the file representing this fd, as determined bystat().static ParcelFileDescriptoropen(File file, int mode)Create a new ParcelFileDescriptor accessing a given file.static intparseMode(String mode)Converts a string representing a file mode, such as "rw", into a bitmask suitable for use withopen(java.io.File, int).voidreleaseResources()Called when the fd is being closed, for subclasses to release any other resources associated with it, such as acquired providers.longseekTo(long pos)This is needed for implementing AssetFileDescriptor.AutoCloseOutputStream, and I really don't think we want it to be public.StringtoString()Returns a string containing a concise, human-readable description of this object.voidwriteToParcel(Parcel out, int flags)Flatten this object in to a Parcel.
-
-
-
Field Detail
-
MODE_WORLD_READABLE
@Deprecated public static final int MODE_WORLD_READABLE
Deprecated.Creating world-readable files is very dangerous, and likely to cause security holes in applications. It is strongly discouraged; instead, applications should use more formal mechanism for interactions such asContentProvider,BroadcastReceiver, andandroid.app.Service. There are no guarantees that this access mode will remain on a file, such as when it goes through a backup and restore.For use withopen(java.io.File, int): ifMODE_CREATEhas been supplied and this file doesn't already exist, then create the file with permissions such that any application can read it.- See Also:
- Constant Field Values
-
MODE_WORLD_WRITEABLE
@Deprecated public static final int MODE_WORLD_WRITEABLE
Deprecated.Creating world-writable files is very dangerous, and likely to cause security holes in applications. It is strongly discouraged; instead, applications should use more formal mechanism for interactions such asContentProvider,BroadcastReceiver, andandroid.app.Service. There are no guarantees that this access mode will remain on a file, such as when it goes through a backup and restore.For use withopen(java.io.File, int): ifMODE_CREATEhas been supplied and this file doesn't already exist, then create the file with permissions such that any application can write it.- See Also:
- Constant Field Values
-
MODE_READ_ONLY
public static final int MODE_READ_ONLY
For use withopen(java.io.File, int): open the file with read-only access.- See Also:
- Constant Field Values
-
MODE_WRITE_ONLY
public static final int MODE_WRITE_ONLY
For use withopen(java.io.File, int): open the file with write-only access.- See Also:
- Constant Field Values
-
MODE_READ_WRITE
public static final int MODE_READ_WRITE
For use withopen(java.io.File, int): open the file with read and write access.- See Also:
- Constant Field Values
-
MODE_CREATE
public static final int MODE_CREATE
For use withopen(java.io.File, int): create the file if it doesn't already exist.- See Also:
- Constant Field Values
-
MODE_TRUNCATE
public static final int MODE_TRUNCATE
For use withopen(java.io.File, int): erase contents of file when opening.- See Also:
- Constant Field Values
-
MODE_APPEND
public static final int MODE_APPEND
For use withopen(java.io.File, int): append to end of file while writing.- See Also:
- Constant Field Values
-
CREATOR
public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR
-
-
Constructor Detail
-
ParcelFileDescriptor
public ParcelFileDescriptor(ParcelFileDescriptor wrapped)
Create a new ParcelFileDescriptor wrapped around another descriptor. By default all method calls are delegated to the wrapped descriptor.
-
ParcelFileDescriptor
public ParcelFileDescriptor(FileDescriptor fd)
-
ParcelFileDescriptor
public ParcelFileDescriptor(FileDescriptor fd, FileDescriptor commChannel)
-
-
Method Detail
-
open
public static ParcelFileDescriptor open(File file, int mode) throws FileNotFoundException
Create a new ParcelFileDescriptor accessing a given file.- Parameters:
file- The file to be opened.mode- The desired access mode, must be one ofMODE_READ_ONLY,MODE_WRITE_ONLY, orMODE_READ_WRITE; may also be any combination ofMODE_CREATE,MODE_TRUNCATE,MODE_WORLD_READABLE, andMODE_WORLD_WRITEABLE.- Returns:
- a new ParcelFileDescriptor pointing to the given file.
- Throws:
FileNotFoundException- if the given file does not exist or can not be opened with the requested mode.- See Also:
parseMode(String)
-
dup
public static ParcelFileDescriptor dup(FileDescriptor orig) throws IOException
Create a new ParcelFileDescriptor that is a dup of an existing FileDescriptor. This obeys standard POSIX semantics, where the new file descriptor shared state such as file position with the original file descriptor.- Throws:
IOException
-
dup
public ParcelFileDescriptor dup() throws IOException
Create a new ParcelFileDescriptor that is a dup of the existing FileDescriptor. This obeys standard POSIX semantics, where the new file descriptor shared state such as file position with the original file descriptor.- Throws:
IOException
-
fromFd
public static ParcelFileDescriptor fromFd(int fd) throws IOException
Create a new ParcelFileDescriptor from a raw native fd. The new ParcelFileDescriptor holds a dup of the original fd passed in here, so you must still close that fd as well as the new ParcelFileDescriptor.- Parameters:
fd- The native fd that the ParcelFileDescriptor should dup.- Returns:
- Returns a new ParcelFileDescriptor holding a FileDescriptor for a dup of the given fd.
- Throws:
IOException
-
adoptFd
public static ParcelFileDescriptor adoptFd(int fd)
Take ownership of a raw native fd in to a new ParcelFileDescriptor. The returned ParcelFileDescriptor now owns the given fd, and will be responsible for closing it. You must not close the fd yourself.- Parameters:
fd- The native fd that the ParcelFileDescriptor should adopt.- Returns:
- Returns a new ParcelFileDescriptor holding a FileDescriptor for the given fd.
-
fromSocket
public static ParcelFileDescriptor fromSocket(Socket socket)
Create a new ParcelFileDescriptor from the specified Socket. The new ParcelFileDescriptor holds a dup of the original FileDescriptor in the Socket, so you must still close the Socket as well as the new ParcelFileDescriptor.- Parameters:
socket- The Socket whose FileDescriptor is used to create a new ParcelFileDescriptor.- Returns:
- A new ParcelFileDescriptor with the FileDescriptor of the specified Socket.
-
fromDatagramSocket
public static ParcelFileDescriptor fromDatagramSocket(DatagramSocket datagramSocket)
Create a new ParcelFileDescriptor from the specified DatagramSocket.- Parameters:
datagramSocket- The DatagramSocket whose FileDescriptor is used to create a new ParcelFileDescriptor.- Returns:
- A new ParcelFileDescriptor with the FileDescriptor of the specified DatagramSocket.
-
createPipe
public static ParcelFileDescriptor[] createPipe() throws IOException
Create two ParcelFileDescriptors structured as a data pipe. The first ParcelFileDescriptor in the returned array is the read side; the second is the write side.- Throws:
IOException
-
createReliablePipe
public static ParcelFileDescriptor[] createReliablePipe() throws IOException
Create two ParcelFileDescriptors structured as a data pipe. The first ParcelFileDescriptor in the returned array is the read side; the second is the write side.The write end has the ability to deliver an error message through
closeWithError(String)which can be handled by the read end callingcheckError(), usually after detecting an EOF. This can also be used to detect remote crashes.- Throws:
IOException
-
createSocketPair
public static ParcelFileDescriptor[] createSocketPair() throws IOException
Create two ParcelFileDescriptors structured as a pair of sockets connected to each other. The two sockets are indistinguishable.- Throws:
IOException
-
createSocketPair
public static ParcelFileDescriptor[] createSocketPair(int type) throws IOException
- Throws:
IOException
-
createReliableSocketPair
public static ParcelFileDescriptor[] createReliableSocketPair() throws IOException
Create two ParcelFileDescriptors structured as a pair of sockets connected to each other. The two sockets are indistinguishable.Both ends have the ability to deliver an error message through
closeWithError(String)which can be detected by the other end callingcheckError(), usually after detecting an EOF. This can also be used to detect remote crashes.- Throws:
IOException
-
createReliableSocketPair
public static ParcelFileDescriptor[] createReliableSocketPair(int type) throws IOException
- Throws:
IOException
-
fromData
@Deprecated public static ParcelFileDescriptor fromData(byte[] data, String name) throws IOException
Deprecated.- Parameters:
data- Data to copy.name- Name for the shared memory area that may back the file descriptor. This is purely informative and may benull.- Returns:
- A ParcelFileDescriptor.
- Throws:
IOException- if there is an error while creating the shared memory area.
-
parseMode
public static int parseMode(String mode)
Converts a string representing a file mode, such as "rw", into a bitmask suitable for use withopen(java.io.File, int).- Parameters:
mode- The string representation of the file mode.- Returns:
- A bitmask representing the given file mode.
- Throws:
IllegalArgumentException- if the given string does not match a known file mode.
-
getFileDescriptor
public FileDescriptor getFileDescriptor()
Retrieve the actual FileDescriptor associated with this object.- Returns:
- Returns the FileDescriptor associated with this object.
-
getStatSize
public long getStatSize()
Return the total size of the file representing this fd, as determined bystat(). Returns -1 if the fd is not a file.
-
seekTo
public long seekTo(long pos) throws IOExceptionThis is needed for implementing AssetFileDescriptor.AutoCloseOutputStream, and I really don't think we want it to be public.- Throws:
IOException
-
getFd
public int getFd()
Return the native fd int for this ParcelFileDescriptor. The ParcelFileDescriptor still owns the fd, and it still must be closed through this API.
-
detachFd
public int detachFd()
Return the native fd int for this ParcelFileDescriptor and detach it from the object here. You are now responsible for closing the fd in native code.You should not detach when the original creator of the descriptor is expecting a reliable signal through
close()orcloseWithError(String).- See Also:
canDetectErrors()
-
close
public void close() throws IOExceptionClose the ParcelFileDescriptor. This implementation closes the underlying OS resources allocated to represent this stream.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Throws:
IOException- If an error occurs attempting to close this ParcelFileDescriptor.
-
closeWithError
public void closeWithError(String msg) throws IOException
Close the ParcelFileDescriptor, informing any peer that an error occurred while processing. If the creator of this descriptor is not observing errors, it will close normally.- Parameters:
msg- describing the error; must not be null.- Throws:
IOException
-
releaseResources
public void releaseResources()
Called when the fd is being closed, for subclasses to release any other resources associated with it, such as acquired providers.
-
canDetectErrors
public boolean canDetectErrors()
Indicates if this ParcelFileDescriptor can communicate and detect remote errors/crashes.- See Also:
checkError()
-
checkError
public void checkError() throws IOExceptionDetect and throw if the other end of a pipe or socket pair encountered an error or crashed. This allows a reader to distinguish between a valid EOF and an error/crash.If this ParcelFileDescriptor is unable to detect remote errors, it will return silently.
- Throws:
IOException- for normal errors.ParcelFileDescriptor.FileDescriptorDetachedException- if the remote side calleddetachFd(). Once detached, the remote side is unable to communicate any errors throughcloseWithError(String).- See Also:
canDetectErrors()
-
toString
public String toString()
Description copied from class:ObjectReturns a string containing a concise, human-readable description of this object. Subclasses are encouraged to override this method and provide an implementation that takes into account the object's type and data. The default implementation is equivalent to the following expression:getClass().getName() + '@' + Integer.toHexString(hashCode())
See Writing a useful
toStringmethod if you intend implementing your owntoStringmethod.
-
finalize
protected void finalize() throws ThrowableDescription copied from class:ObjectInvoked when the garbage collector has detected that this instance is no longer reachable. The default implementation does nothing, but this method can be overridden to free resources.Note that objects that override
finalizeare significantly more expensive than objects that don't. Finalizers may be run a long time after the object is no longer reachable, depending on memory pressure, so it's a bad idea to rely on them for cleanup. Note also that finalizers are run on a single VM-wide finalizer thread, so doing blocking work in a finalizer is a bad idea. A finalizer is usually only necessary for a class that has a native peer and needs to call a native method to destroy that peer. Even then, it's better to provide an explicitclosemethod (and implementCloseable), and insist that callers manually dispose of instances. This works well for something like files, but less well for something like aBigIntegerwhere typical calling code would have to deal with lots of temporaries. Unfortunately, code that creates lots of temporaries is the worst kind of code from the point of view of the single finalizer thread.If you must use finalizers, consider at least providing your own
ReferenceQueueand having your own thread process that queue.Unlike constructors, finalizers are not automatically chained. You are responsible for calling
super.finalize()yourself.Uncaught exceptions thrown by finalizers are ignored and do not terminate the finalizer thread. See Effective Java Item 7, "Avoid finalizers" for more.
-
describeContents
public int describeContents()
Description copied from interface:ParcelableDescribe the kinds of special objects contained in this Parcelable's marshalled representation.- Specified by:
describeContentsin interfaceParcelable- Returns:
- a bitmask indicating the set of special object types marshalled by the Parcelable.
-
writeToParcel
public void writeToParcel(Parcel out, int flags)
Flatten this object in to a Parcel. IfParcelable.PARCELABLE_WRITE_RETURN_VALUEis set in flags, the file descriptor will be closed after a copy is written to the Parcel.- Specified by:
writeToParcelin interfaceParcelable- Parameters:
out- The Parcel in which the object should be written.flags- Additional flags about how the object should be written. May be 0 orParcelable.PARCELABLE_WRITE_RETURN_VALUE.
-
-