命令行I/O
程序通常从命令行运行,并在命令行环境中与用户交互,Java平台以两种方式支持这种交互:通过标准流和控制台。
标准流标准流是许多操作系统的一个特性,默认情况下,它们从键盘读取输入并将输出写入显示器,它们还支持文件和程序之间的I/O,但该功能由命令行解释器控制,而不是程序。
Java平台支持三种标准流:标准输入,可通过System.in访问;标准输出,可通过System.out访问;和标准错误,通过System.err访问。这些对象是自动定义的,不需要打开,标准输出和标准错误均用于输出,多带带具有错误输出允许用户将常规输出转移到文件并仍然能够读取错误消息,有关更多信息,请参阅命令行解释程序的文档。
你可能希望标准流是字符流,但由于历史原因,它们是字节流,System.out和System.err定义为PrintStream对象,虽然从技术上讲它是字节流,但PrintStream利用内部字符流对象来模拟字符流的许多功能。
相比之下,System.in是一个没有字符流功能的字节流,要将标准输入用作字符流,请在InputStreamReader中包装System.in。
InputStreamReader cin = new InputStreamReader(System.in);控制台
控制台是标准流的更高级替代方案,这是一个类型为Console的多带带、预定义的对象,它具有标准流提供的大部分功能,以及其他功能。控制台对于安全密码输入特别有用,Console对象还通过其reader和writer方法提供真正的字符流的输入和输出流。
在程序可以使用控制台之前,它必须通过调用System.console()来尝试检索Console对象,如果Console对象可用,则此方法将返回该对象,如果System.console返回NULL,则不允许使用Console操作,因为操作系统不支持它们,或者因为程序是在非交互式环境中启动的。
Console对象通过其readPassword方法支持安全密码输入,此方法有助于以两种方式保护密码输入,首先,它抑制回显,因此密码在用户屏幕上不可见,其次,readPassword返回一个字符数组,而不是String,因此密码可以被覆盖,一旦不再需要就将其从内存中删除。
Password示例是用于更改用户密码的原型程序,它演示了几种Console方法。
import java.io.Console; import java.util.Arrays; import java.io.IOException; public class Password { public static void main (String args[]) throws IOException { Console c = System.console(); if (c == null) { System.err.println("No console."); System.exit(1); } String login = c.readLine("Enter your login: "); char [] oldPassword = c.readPassword("Enter your old password: "); if (verify(login, oldPassword)) { boolean noMatch; do { char [] newPassword1 = c.readPassword("Enter your new password: "); char [] newPassword2 = c.readPassword("Enter new password again: "); noMatch = ! Arrays.equals(newPassword1, newPassword2); if (noMatch) { c.format("Passwords don"t match. Try again.%n"); } else { change(login, newPassword1); c.format("Password for %s changed.%n", login); } Arrays.fill(newPassword1, " "); Arrays.fill(newPassword2, " "); } while (noMatch); } Arrays.fill(oldPassword, " "); } // Dummy change method. static boolean verify(String login, char[] password) { // This method always returns // true in this example. // Modify this method to verify // password according to your rules. return true; } // Dummy change method. static void change(String login, char[] password) { // Modify this method to change // password according to your rules. } }
Password类遵循以下步骤:
尝试检索Console对象,如果对象不可用,则中止。
调用Console.readLine以提示并读取用户的登录名。
调用Console.readPassword以提示并读取用户的现有密码。
调用verify以确认用户有权更改密码(在此示例中,verify是一个始终返回true的虚方法)。
重复以下步骤,直到用户输入两次相同的密码:
调用Console.readPassword两次以提示并读取新密码。
如果用户两次都输入相同的密码,请调用change以进行更改(同样,change是一种虚拟方法)。
用空格覆盖这两个密码。
用空格覆盖旧密码。
上一篇:格式化流 下一篇:数据流文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72962.html
系统实用工具 System类实现了许多系统实用程序,其中一些已在上一节配置实用程序中介绍过,本节介绍一些其他系统实用程序。 命令行I/O对象 系统提供了几个预定义的I/O对象,这些对象在Java应用程序中非常有用,可以从命令行启动,它们实现了大多数操作系统提供的标准I/O流,以及用于输入密码的控制台对象,有关更多信息,请参阅基础I/O课程中的命令行I/O。 系统属性 在属性中,我们研究了应用程序可...
字符流 Java平台使用Unicode约定存储字符值,字符流I/O自动将此内部格式与本地字符集进行转换,在Western语言环境中,本地字符集通常是ASCII的8位超集。 对于大多数应用程序,具有字符流的I/O并不比具有字节流的I/O复杂,使用流类完成的输入和输出会自动转换为本地字符集和从本地字符集转换,使用字符流代替字节流的程序会自动适应本地字符集并为国际化做了准备 — 所有这些都无需程序员的额...
配置实用工具 本节介绍一些帮助应用程序访问其启动上下文的配置实用程序。 属性 Properties是作为键/值对管理的配置值,在每对中,键和值都是字符串值,键标识并用于检索值,就像变量名用于检索变量的值一样。例如,能够下载文件的应用程序可能使用名为download.lastDirectory的属性来跟踪上次下载所使用的目录。 要管理属性,请创建java.util.Properties的实例,此类提...
Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...
数据流 数据流支持原始数据类型值(boolean、char、byte、short、int、long、float和double)以及String值的二进制I/O,所有数据流都实现DataInput接口或DataOutput接口,本节重点介绍这些接口最广泛使用的实现,DataInputStream和DataOutputStream。 DataStreams示例通过写出一组数据记录,然后再次读取它们来演...
阅读 1288·2023-04-25 19:33
阅读 1170·2021-10-21 09:39
阅读 3644·2021-09-09 09:32
阅读 2613·2019-08-30 10:58
阅读 1598·2019-08-29 16:17
阅读 873·2019-08-29 15:29
阅读 2884·2019-08-26 11:55
阅读 2657·2019-08-26 10:33