FileDescriptor is the lowest level representation of a File, Device, or Socket. You can create any of the IO classes which take a FileDescriptor as an argument by querying an open Socket or File for the FileDescriptor.
The FileDescriptor class also contains static fields representing Standard Input, Output and Error. You can use these directly if desired but it is recommended you go through System.in, System.out, and System.err streams respectively.
Applications should not create new FileDescriptors.