在FileDescriptor.java的源代码中,我们有以下静态变量:
/**
* A handle to the standard input stream. Usually, this file
* descriptor is not used directly, but rather via the input stream
* known as <code>System.in</code>.
*
* @see java.lang.System#in
*/
public static final FileDescriptor in = new FileDescriptor(0);
/**
* A handle to the standard output stream. Usually, this file
* descriptor is not used directly, but rather via the output stream
* known as <code>System.out</code>.
* @see java.lang.System#out
*/
public static final FileDescriptor out = new FileDescriptor(1);
这里我直接使用它,而不是System.out。现在检查以下程序:
import java.io.*;
public class First
{
public static void main(String[] args) throws Exception
{
FileInputStream fis = new FileInputStream(FileDescriptor.out);
byte[] b = new byte[8];
System.out.println(fis.read(b));//6
for(byte b1: b)
{
System.out.println(b1);
}
}
}
输入
hello
输出
6
104
101
108
108
111
10
0
0
请注意,即使我在构造函数中使用FileDescriptor.out,它也不会给出任何错误并且对标准输入流完美地工作。
再检查一个程序:
import java.io.*;
public class First
{
public static void main(String[] args) throws Exception
{
FileOutputStream fos = new FileOutputStream(FileDescriptor.in);
byte[] b = {65, 66, 67};
fos.write(b);
}
}
输出
ABC
请注意,即使我在构造函数中使用FileDescriptor.in,它也不会给出任何错误并且对标准输出流完美地工作。
我知道java中的FileDescriptor是不透明的,我不应该将它与Linux中的文件描述符概念进行比较。我只是想知道它是如何在JAVA中创建的。如果一个静态变量可以同时读写,那么需要三个(in,out和err)。
答案 0 :(得分:3)
如果你从shell运行你的测试,没有重定向,那么文件描述符0,1和2可能是同一个文件:/ dev / tty或类似的东西(你的终端)。
这可以解释为什么你可以从任何这些描述符中读/写。