java - FileDescriptor.in 与 System.in

标签 java io inputstream outputstream

在 Java 中,我们可以使用 Scanner 类来获取输入,但它不如 IO Package 的 BufferedReader 效率高。 在初始化 Scanner 类的对象或 BufferedReader 类的对象时,我们使用 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);

最佳答案

看起来您的问题是“与FileDescriptor.in 相比,System.in 好吗?”

答案:

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

第2点的证明在System类的源代码中:

    FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
    // ...
    setIn0(new BufferedInputStream(fdIn));

您从 System.in 获得的标准流是一个从 FileDescriptor.in 读取的 FileInputStream,但是有一个 BufferedInputStream 出于性能原因将其包裹起来(它提高了小读取的性能)。

关于java - FileDescriptor.in 与 System.in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50114471/

相关文章:

java - 获取 "Deadlock found when trying to get lock; try restarting transaction"

io - 如何处理长时间运行的外部函数调用,例如 Rust 中的阻塞 I/O?

c++ - 如何在 C++ 中打开文件?

java - 如何知道串口收到的报文长度是多少?

sockets - Android InputStream

java - @CacheEvict 的 Gemfire EntryNotFoundException

java - jList 不返回所需的字符串值

java - 分析嵌套循环运行时间?

java - 使用java修改XML文件中的特定元素

java - 要从 Java 中的 DataInputStream 读取的未知缓冲区大小