Module java.base
Package java.io

Class Console

java.lang.Object
java.io.Console
所有已实现的接口:
Flushable

public sealed class Console extends Object implements Flushable
用于访问与当前Java虚拟机关联的基于字符的控制台设备的方法。

虚拟机是否具有控制台取决于底层平台,还取决于虚拟机的启动方式。如果虚拟机是从交互式命令行启动的,而没有重定向标准输入和输出流,那么它的控制台将存在,并且通常将连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如通过后台作业调度程序,则可能没有控制台。

如果此虚拟机具有控制台,则可以通过调用System.console()方法获取此类的唯一实例。如果没有可用的控制台设备,则调用该方法将返回null

读取和写入操作是同步的,以确保关键操作的原子完成;因此,在多线程场景中调用方法readLine()readPassword()format()printf()以及通过reader()writer()返回的对象的读取、格式化和写入操作可能会阻塞。

在通过reader()writer()返回的对象上调用close()不会关闭这些对象的基础流。

当到达控制台输入流的末尾时,控制台读取方法将返回null,例如在Unix上键入control-D或在Windows上键入control-Z。如果稍后在控制台的输入设备上输入了其他字符,则后续读取操作将成功。

除非另有说明,否则将null参数传递给此类中的任何方法将导致抛出NullPointerException

安全注意事项: 如果应用程序需要读取密码或其他安全数据,应使用readPassword()readPassword(String, Object...),并在处理后手动将返回的字符数组清零,以最小化内存中敏感数据的生命周期。

Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
    (passwd = cons.readPassword("[%s]", "Password:")) != null) {
    ...
    java.util.Arrays.fill(passwd, ' ');
}
自1.6版本起:
  • Method Details

    • writer

      public PrintWriter writer()
      检索与此控制台关联的唯一PrintWriter对象。
      返回:
      与此控制台关联的PrintWriter
    • reader

      public Reader reader()
      检索与此控制台关联的唯一Reader对象。

      此方法旨在供复杂应用程序使用,例如利用Scanner提供的丰富解析/扫描功能的Scanner对象:

          Console con = System.console();
          if (con != null) {
              Scanner sc = new Scanner(con.reader());
              ...
          }
      

      对于只需要逐行读取的简单应用程序,请使用readLine(java.lang.String, java.lang.Object...)

      返回的对象上的批量读取操作read(char[]) read(char[], int, int) read(java.nio.CharBuffer)将不会读取超出每次调用的行界限的字符,即使目标缓冲区有更多字符的空间。如果在控制台的输入设备上尚未输入或达到行界限,则Readerread方法可能会阻塞。行界限被认为是换行符('\n')、回车符('\r')、紧接着的回车符后跟换行符或流的结尾中的任何一个。

      返回:
      与此控制台关联的Reader
    • format

      public Console format(String fmt, Object... args)
      使用指定的格式字符串和参数向此控制台的输出流写入格式化的字符串。
      参数:
      fmt - 如格式字符串语法中所述的格式字符串
      args - 格式字符串中引用的参数。如果有更多的参数比格式说明符,则额外的参数将被忽略。参数的数量是可变的,可以为零。参数的最大数量受Java数组的最大维度限制,由Java虚拟机规范定义。对于null参数的行为取决于转换
      返回:
      此控制台
      抛出:
      IllegalFormatException - 如果格式字符串包含非法语法、与给定参数不兼容的格式说明符、给定格式字符串的参数不足或其他非法条件。有关所有可能的格式错误的规范,请参阅格式化类规范的详细信息部分。
    • printf

      public Console printf(String format, Object... args)
      使用指定的格式字符串和参数向此控制台的输出流写入格式化的字符串的便捷方法。 con.printf(format, args)形式调用此方法的行为与调用

          con.format(format, args)
      
      参数:
      format - 如格式字符串语法中所述的格式字符串。
      args - 格式字符串中引用的参数。如果有更多的参数比格式说明符,则额外的参数将被忽略。参数的数量是可变的,可以为零。参数的最大数量受Java数组的最大维度限制,由Java虚拟机规范定义。对于null参数的行为取决于转换
      返回:
      此控制台
      抛出:
      IllegalFormatException - 如果格式字符串包含非法语法、与给定参数不兼容的格式说明符、给定格式字符串的参数不足或其他非法条件。有关所有可能的格式错误的规范,请参阅格式化类规范的详细信息部分。
    • readLine

      public String readLine(String fmt, Object... args)
      提供格式化的提示,然后从控制台读取一行文本。
      参数:
      fmt - 如格式字符串语法中所述的格式字符串。
      args - 格式字符串中引用的参数。如果有更多的参数比格式说明符,则额外的参数将被忽略。参数的数量是可变的,可以为零。参数的最大数量受Java数组的最大维度限制,由Java虚拟机规范定义。
      返回:
      包含从控制台读取的行的字符串,不包括任何行终止字符,如果已到达流的末尾,则返回null
      抛出:
      IllegalFormatException - 如果格式字符串包含非法语法、与给定参数不兼容的格式说明符、给定格式字符串的参数不足或其他非法条件。有关所有可能的格式错误的规范,请参阅格式化类规范的详细信息部分。
      IOError - 如果发生I/O错误。
    • readLine

      public String readLine()
      从控制台读取一行文本。
      返回值:
      包含从控制台读取的行的字符串,不包括任何行终止字符,如果已到达流的末尾,则返回null
      抛出:
      IOError - 如果发生I/O错误。
    • readPassword

      public char[] readPassword(String fmt, Object... args)
      提供格式化的提示,然后从控制台读取密码或口令,禁用回显。
      参数:
      fmt - 作为提示文本的格式字符串语法描述的格式字符串。
      args - 格式字符串中格式说明符引用的参数。如果有比格式说明符更多的参数,则额外的参数将被忽略。参数的最大数量受Java数组的最大维度限制,由Java虚拟机规范定义。
      返回值:
      包含从控制台读取的密码或口令的字符数组,不包括任何行终止字符,如果已到达流的末尾,则返回null
      抛出:
      IllegalFormatException - 如果格式字符串包含非法语法、与给定参数不兼容的格式说明符、给定格式字符串的参数不足或其他非法条件。有关所有可能的格式错误的规范,请参阅格式化类规范的详细信息部分。
      IOError - 如果发生I/O错误。
    • readPassword

      public char[] readPassword()
      从控制台读取密码或口令,禁用回显。
      返回值:
      包含从控制台读取的密码或口令的字符数组,不包括任何行终止字符,如果已到达流的末尾,则返回null
      抛出:
      IOError - 如果发生I/O错误。
    • flush

      public void flush()
      刷新控制台并强制立即写入任何缓冲输出。
      指定者:
      flush 在接口 Flushable
    • charset

      public Charset charset()
      返回用于ConsoleCharset对象。

      返回的字符集对应于主机环境或用户指定的输入和输出源(例如键盘和/或显示器)。它可能不一定与从Charset.defaultCharset()返回的默认字符集相同。

      返回值:
      用于ConsoleCharset对象
      自:
      17