FileDescriptor 是操作系統層面文件/套接字句柄的 Java 映射,封裝一個 int fd 域。JVM 預定義三個標準描述符:
FileDescriptor.in (fd=0) —— 標準輸入(鍵盤)FileDescriptor.out (fd=1) —— 標準輸出(屏幕)FileDescriptor.err (fd=2) —— 標準錯誤輸出(屏幕)關鍵限制:FileDescriptor 本身無任何讀寫方法,必須構造對應的 FileInputStream/FileOutputStream 才能操作。
// 底層實現等價於 System.out.print('A')
FileOutputStream fos = new FileOutputStream(FileDescriptor.out);
fos.write('A');
fos.close();
System.out 內部實際是 PrintStream 包裹 FileOutputStream(FileDescriptor.out),提供更豐富的 print/println 接口。
// 通過文件名獲取 FileDescriptor,再構造流(等效於直接用文件名構造)
FileOutputStream out1 = new FileOutputStream("file.txt");
FileDescriptor fd = out1.getFD(); // 獲取底層描述符
FileOutputStream out2 = new FileOutputStream(fd); // 基於描述符創建新流
out1.write('A');
out2.write('a'); // 同一文件,兩個流交替寫入
運行結果顯示 file.txt 內容為 Aa,驗證了同一描述符對應的多個流共享文件偏移量。
public final class FileDescriptor {
private int fd;
public static final FileDescriptor out = new FileDescriptor(1);
private FileDescriptor(int fd) { this.fd = fd; ... }
// valid() 檢查描述符是否有效
public boolean valid() { return fd != -1; }
}
FileDescriptor 是 JVM 與 OS 文件系統的橋樑。日常開發直接使用 System.in/out/err 或文件路徑構造流即可;僅在需要底層描述符傳遞(如 JNI、進程間通信)時直接操作。