深入学习java源码之FileDescriptor.valid()与FileDescriptor.sync()
文件描述符类的实例用作表示打开文件,开放套接字或其他字节源或信宿的底层机器特定结构的不透明句柄。 文件描述符的主要实际用途是创建一个FileInputStream或FileOutputStream来包含它。 应用程序不应创建自己的文件描述符。 字段
Modifier and TypeField and Descriptionstatic FileDescriptor
err
标准错误流的句柄。
static FileDescriptor
in
标准输入流的句柄。
static FileDescriptor
out
标准输出流的句柄。
方法
Modifier and TypeMethod and Descriptionvoid
sync()
强制所有系统缓冲区与底层设备同步。
boolean
valid()
测试此文件描述符对象是否有效。
java源码
package java.io;
import java.util.ArrayList;
import java.util.List;
public final class FileDescriptor {
private int fd;
private long handle;
private Closeable parent;
private List otherParents;
private boolean closed;
public /**/ FileDescriptor() {
fd = -1;
handle = -1;
}
static {
initIDs();
}
// Set up JavaIOFileDescriptorAccess in SharedSecrets
static {
sun.misc.SharedSecrets.setJavaIOFileDescriptorAccess(
new sun.misc.JavaIOFileDescriptorAccess() {
public void set(FileDescriptor obj, int fd) {
obj.fd = fd;
}
public int get(FileDescriptor obj) {
return obj.fd;
}
public void setHandle(FileDescriptor obj, long handle) {
obj.handle = handle;
}
public long getHandle(FileDescriptor obj) {
return obj.handle;
}
}
);
}
public static final FileDescriptor in = standardStream(0);
public static final FileDescriptor out = standardStream(1);
public static final FileDescriptor err = standardStream(2);
public boolean valid() {
return ((handle != -1) || (fd != -1));
}
public native void sync() throws SyncFailedException;
/* This routine initializes JNI field offsets for the class */
private static native void initIDs();
private static native long set(int d);
private static FileDescriptor standardStream(int fd) {
FileDescriptor desc = new FileDescriptor();
desc.handle = set(fd);
return desc;
}
synchronized void attach(Closeable c) {
if (parent == null) {
// first caller gets to do this
parent = c;
} else if (otherParents == null) {
otherParents = new ArrayList();
otherParents.add(parent);
otherParents.add(c);
} else {
otherParents.add(c);
}
}
@SuppressWarnings("try")
synchronized void closeAll(Closeable releaser) throws IOException {
if (!closed) {
closed = true;
IOException ioe = null;
try (Closeable c = releaser) {
if (otherParents != null) {
for (Closeable referent : otherParents) {
try {
referent.close();
} catch(IOException x) {
if (ioe == null) {
ioe = x;
} else {
ioe.addSuppressed(x);
}
}
}
}
} catch(IOException ex) {
/*
* If releaser close() throws IOException
* add other exceptions as suppressed.
*/
if (ioe != null)
ex.addSuppressed(ioe);
ioe = ex;
} finally {
if (ioe != null)
throw ioe;
}
}
}
}