简介

程序经常从命令行运行并与在命令行环境中的用户交互。Java平台支持这种互动的方式有两种:通过标准流,通过控制台

标准流

标准流是许多操作系统的一项功能。默认情况下,他们从键盘输入读取和输出到显示器。它们还支持对文件和程序之间的I / O,但功能由命令行解释器而不是程序控制。

Java平台支持三种标准流:标准输入,通过访问System.in; 标准输出,访问通过System.out; 和标准错误,访问过System.err。这些对象被自动定义,不需要打开。标准输出和标准错误都用于输出; 具有误差输出分别允许用户定期输出转移到一个文件,并且仍然能够读取错误消息。欲了解更多信息,请参阅文档,您的命令行解释器。

你可能期望的标准流是字符流,但是,由于历史的原因,他们是字节流。System.out和System.err被定义为 PrintStream对象。虽然在技术上是一个字节流,PrintStream利用内部字符流对象来模拟许多的字符流的特征。

与此相反,System.in是没有字符流特征字节流。使用标准输入作为字符流,包装System.in在InputStreamReader类中。

InputStreamReader cin = new InputStreamReader(System.in);

控制台

比标准流更先进的替代方案是控制台。这是一个类型单一,预定义的对象。 Console有大部分由标准流提供的功能,另外还有其他。该控制台对于安全的密码输入特别有用。控制台对象还提供了真字符流,通过其输入和输出流reader和writer方法。

前一个程序可以使用控制台,它必须尝试通过调用来检索控制台对象System.console()。如果控制台对象,此方法将返回。如果System.console返回值为NULL,其原因要么是因为控制台操作是不允许的,要么是因为操作系统不支持,要么是因为该方案是在非交互式环境中启动。

控制台对象支持通过其安全的密码输入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的步骤如下:

1,尝试检索Console对象。如果对象是不可用的,中止。

2,调用Console.readLine提示并读取用户的登录名。

3,调用Console.readPassword提示并读取用户的现有密码。

4,调用verify,以确认用户是否有权更改密码。(在这个例子中,verify是一个虚拟方法,这个方法总是返回true。)

5,重复以下步骤直到用户输入两次相同的密码:

调用Console.readPassword两次提示输入和读取新的密码。

如果用户输入的密码两次,调用change去改变它。(同样,change是伪方法)。

用空格覆盖两个密码。

6,用空格覆盖旧的密码。


IO Streams:来源于命令行的IO的更多相关文章

  1. UE4命令行参数解析

    转自:https://blog.csdn.net/u012999985/article/details/53544389 一 .命令行参数简述命令行参数是一连串的关键字字符串,当运行可执行文件时可以通 ...

  2. Go语言中的IO操作、Flag包以及urfave/cli命令行框架

    一.格式化输入和输出 1.从终端获取用户的输入 fmt.Scanf  空格作为分隔符,占位符和格式化输出的一致 fmt.Scan  从终端获取用户的输入,存储在Scanln中的参数里,空格和换行符作为 ...

  3. Objective-C:用命令行参数的格式对文件进行IO操作

    // main.m // 03-copyFile // Created by ma c on 15/8/24. // Copyright (c) 2015年. All rights reserved. ...

  4. Ubuntu 14.10 下进程实时IO监控iotop命令详解

    介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况 ...

  5. Linux进程实时IO监控iotop命令详解

    介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况 ...

  6. docker(三)反正我不喜欢敲命令,daocloud.io管理你的docker,安装远程下载工具aria2 迅雷远程下载 xware

    1.登录daocloud.io 2.寻找合适的镜像 3.查看镜像信息并部署,它给出了一个运行命令,其中有用的只是-V,目录映射,映射了物理服务器的/tddownload到容器的/xware/tddow ...

  7. Centos硬盘IO性能检测命令iostat[转]

    Centos硬盘IO性能检测命令iostat[转] 在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都 ...

  8. FreeBSD查看带宽占用情况,CPU,硬盘IO 虚拟内存等命令

    FreeBSD查看带宽占用情况,CPU,硬盘IO 虚拟内存等命令 来源 https://www.liurongxing.com/freebsd-tips.html 来源 http://blog.51c ...

  9. 性能测试 | Linux系统top命令中的io使用率,很多人都误解了它的具体含义

    body{ text-align:left; width:80%; margin:10px 100px; } 最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题.那么,接 ...

随机推荐

  1. hiho一下 第三十八周 二分答案

    题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...

  2. 我的Linux学习之路的感悟

    首先要跟大家说声抱歉,这么久一直没有更新,有负大家对我的期望. 半年的Linux运维的学习到目前已工作一个月零9天,这一路走来的艰辛和挣扎只有自己最清楚. 首先要感谢公司的同事的宽容接纳和耐心指点.感 ...

  3. python_48_Python3中字符编码与转码

    python3默认是Unicode,不用声明# -*- coding:utf-8 -*-,如果声明则是utf-8 unicode='你好' print('utf-8:',unicode.encode( ...

  4. Hadoop集群批量命令执行

    ./pdsh -R ssh -w node-10-0[0-5] hostname -R:指定传输方式,默认为rsh,本例为ssh,如果希望ssh传输需要另行安装pdsh-rcmd-ssh,如果希望ss ...

  5. IPV6验证正则表达式

    验证ipv6的正则表达式: 例:fe80::ec61:c1d1:9827:82be%13 \s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9 ...

  6. 从指定的view中截图 返回UIImage

    -(UIImage *)getImageFromView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); [view.la ...

  7. display :inline-block 处理点小障碍

    使用inline-block之前先处理点小障碍:inline-block元素会有4px左右的空隙,这个是因为我们写代码时候的换行符所致. 解决办法很简单:在inline-block的父元素中设置样式f ...

  8. SummerVocation_Learning--java的线程死锁

    public class Test_DeadLock implements Runnable { ; static Object o1 = new Object(),o2 = new Object() ...

  9. 7- vue django restful framework 打造生鲜超市 -商品类别数据展示(上)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页 并没有将列表页的数据json 与前端的页面展示结合起来 讲解如果将dr ...

  10. tcl之内容