FileDescriptor.in v/s System.in

FileDescriptor.in v/s System.in

在Java中,我们可以使用Scanner class获取输入,但它不如IO Package的BufferedReader高效。 在初始化 Scanner class 的对象或 BufferedReader class 的对象时,我们使用 InputStream "System.in"。 与 FileDescriptor.in 相比,System.in 好吗?

就像我将 System.in 与 BufferedReader 一起使用:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

并使用 FileDescriptor.in:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(FileDescriptor.in), "ASCII"));

打印时也是如此:

使用System.out输出流:

System.out.println("Hello World!");

将 FileDescriptor.out 与 BufferedWriter 一起使用:

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FileDescriptor.out),"ASCII"), 512);

看来你的问题是"Is System.in good as compared to FileDescriptor.in?"

答案:

  1. 它们不同System.in 可以用 System.setIn 改变,但是 FileDescriptor.in 总是指向相同的 IO 源(当你是 运行 程序时,除非你使用本机代码),所以你'如果您使用 FileDescriptor.in.
  2. 则灵活性会降低
  3. 使用 VM 启动时的默认设置,性能是相同的,如果您记住 System.in 是缓冲的,那么任何替代方案也需要缓冲。

第2点的证明在System class:

中的源代码中
    FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
    // ...
    setIn0(new BufferedInputStream(fdIn));

您从 System.in 获得的标准流是从 FileDescriptor.in 读取的 FileInputStream,但出于性能原因,它周围环绕着一个 BufferedInputStream(它提高了小读取的性能)。