我个人的一点理解:指定文件名字创建流是一种常见和主要的方式。但是,在某些情况下,用户不知道具体文件路径,只知道系统提供的一个“文件描述”。FD 的概念应该是从POSIX 来的。因此,用FD创建文件读写流只是提供了针对这种特殊情况的一个选择。不要期望着在你用文件名字创建的流里面 get 出 FileDescriptor 乐,(如果调用了,肯定返回空)毫无意义。而特殊情况其实非常少,javadoc 说得很明确:用户不能自己创建这个类的对象,只能使用定义好的FileDescriptor.err, in 或 out。 但即使这三个定义好的FD, 用户也可以不必使用,因为,System.err, in 和 out 可以替代他们。因此,不必对 java.io.FileDescriptor 过多纠缠。
http://doc.javanb.com/javasdk-docs-1-5-0-api-cn/java/io/FileDescriptor.html
类 FileDescriptor
java.lang.Object
java.io.FileDescriptor--------------------------------------------------------------------------------public final class FileDescriptorextends Object文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream 或 FileOutputStream。 应用程序不应创建自己的文件描述符。 从以下版本开始:
JDK1.0
另请参见:
FileInputStream, FileOutputStream
如果是直接在cmd窗口下java命令运行,则“123”打印在cmd窗口里
如果你是用Eclipse,则“123”打印在图形化界面里
如果是applet,则打印在j2se platform的小程序窗口里
难道你不疑惑是真么造成的这种差异,我想就是和FileDescriptor中的in,out,err流的位置定义有关
{
public static void main(String[]args)
{
try{
FileInputStream fi1 = new FileInputStream("TestFileDescriptor.java");
FileInputStream fi2 = new FileInputStream("TestFileDescriptor.java");
FileDescriptor fd1 = fi1.getFD();
FileDescriptor fd2 = fi2.getFD();
System.out.println("got " + fd1);
System.out.println("got " + fd2);
if (fd1!=null)
System.out.println("valid " + fd1.valid());
if (fd2!=null)
System.out.println("valid " + fd2.valid());
}catch(Exception e)
{
e.printStackTrace();
}
}
}结果是,针对用一个文件的两个输入六,系统创建了两个不同的FD。