2 * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
3 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
28 import java.util.concurrent.atomic.AtomicInteger;
31 * Instances of the file descriptor class serve as an opaque handle
32 * to the underlying machine-specific structure representing an open
33 * file, an open socket, or another source or sink of bytes. The
34 * main practical use for a file descriptor is to create a
35 * <code>FileInputStream</code> or <code>FileOutputStream</code> to
38 * Applications should not create their own file descriptors.
40 * @author Pavani Diwanji
41 * @see java.io.FileInputStream
42 * @see java.io.FileOutputStream
45 public final class FileDescriptor {
50 * A counter for tracking the FIS/FOS/RAF instances that
51 * use this FileDescriptor. The FIS/FOS.finalize() will not release
52 * the FileDescriptor if it is still under user by a stream.
54 private AtomicInteger useCount;
57 * Constructs an (invalid) FileDescriptor
60 public /**/ FileDescriptor() {
62 useCount = new AtomicInteger();
65 private /* */ FileDescriptor(int fd) {
67 useCount = new AtomicInteger();
71 * A handle to the standard input stream. Usually, this file
72 * descriptor is not used directly, but rather via the input stream
73 * known as <code>System.in</code>.
75 * @see java.lang.System#in
77 public static final FileDescriptor in = new FileDescriptor(0);
80 * A handle to the standard output stream. Usually, this file
81 * descriptor is not used directly, but rather via the output stream
82 * known as <code>System.out</code>.
83 * @see java.lang.System#out
85 public static final FileDescriptor out = new FileDescriptor(1);
88 * A handle to the standard error stream. Usually, this file
89 * descriptor is not used directly, but rather via the output stream
90 * known as <code>System.err</code>.
92 * @see java.lang.System#err
94 public static final FileDescriptor err = new FileDescriptor(2);
97 * Tests if this file descriptor object is valid.
99 * @return <code>true</code> if the file descriptor object represents a
100 * valid, open file, socket, or other active I/O connection;
101 * <code>false</code> otherwise.
103 public boolean valid() {
108 * Force all system buffers to synchronize with the underlying
109 * device. This method returns after all modified data and
110 * attributes of this FileDescriptor have been written to the
111 * relevant device(s). In particular, if this FileDescriptor
112 * refers to a physical storage medium, such as a file in a file
113 * system, sync will not return until all in-memory modified copies
114 * of buffers associated with this FileDescriptor have been
115 * written to the physical medium.
117 * sync is meant to be used by code that requires physical
118 * storage (such as a file) to be in a known state For
119 * example, a class that provided a simple transaction facility
120 * might use sync to ensure that all changes to a file caused
121 * by a given transaction were recorded on a storage medium.
123 * sync only affects buffers downstream of this FileDescriptor. If
124 * any in-memory buffering is being done by the application (for
125 * example, by a BufferedOutputStream object), those buffers must
126 * be flushed into the FileDescriptor (for example, by invoking
127 * OutputStream.flush) before that data will be affected by sync.
129 * @exception SyncFailedException
130 * Thrown when the buffers cannot be flushed,
131 * or because the system cannot guarantee that all the
132 * buffers have been synchronized with physical media.
135 public native void sync() throws SyncFailedException;
137 /* This routine initializes JNI field offsets for the class */
138 private static native void initIDs();
144 // Set up JavaIOFileDescriptorAccess in SharedSecrets
146 sun.misc.SharedSecrets.setJavaIOFileDescriptorAccess(
147 new sun.misc.JavaIOFileDescriptorAccess() {
148 public void set(FileDescriptor obj, int fd) {
152 public int get(FileDescriptor obj) {
156 public void setHandle(FileDescriptor obj, long handle) {
157 throw new UnsupportedOperationException();
160 public long getHandle(FileDescriptor obj) {
161 throw new UnsupportedOperationException();
167 // package private methods used by FIS, FOS and RAF
169 int incrementAndGetUseCount() {
170 return useCount.incrementAndGet();
173 int decrementAndGetUseCount() {
174 return useCount.decrementAndGet();