简介

程序经常从命令行运行并与在命令行环境中的用户交互。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. Netweaver和CloudFoundry里的trace开关

    Netweaver 事务码SU01的参数设置里,有很多关于trace(跟踪)的开关. FPTRACELEVEL: 设成04后,能将ADS生成PDF的trace信息写入生成的PDF. 详细原理参考我的b ...

  2. 生成.m文件的python代码中出现的错误

    错误代码 import tempfile import subprocess import shlex import os import numpy as np import scipy.io scr ...

  3. PAT (Basic Level) Practise (中文)- 1003. 我要通过!(20)

    http://www.patest.cn/contests/pat-b-practise/1003 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入 ...

  4. icon踩坑记录

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. angular2新建组件

    1,使用ng g c hello 创建一个新的组件 它创建了4个文件,并更新了app.module.ts 如果想访问这个组件,只需要添加它的路由 成功访问这个组件 Import语句定义了我们需要用到的 ...

  6. ZR#317.【18 提高 2】A(计算几何 二分)

    题意 Sol 非常好的一道题,幸亏这场比赛我没打,不然我估计要死在这个题上qwq 到不是说有多难,关键是细节太多了,我和wcz口胡了一下我的思路,然后他写了一晚上没调出来qwq 解法挺套路的,先提出一 ...

  7. 廖老师git教程执行"git checkout -b dev origin/dev"命令报出:fatal: Cannot update paths and switch to branch 'dev' at the same time. Did you intend to checkout 'origin/dev' which can not be resolved as commit?问题解决

    在学习廖老师git教程之多人协作模块时按照老师的操作先创建了另一个目录,然后在这个目录下从GitHub上clone了 learngit目录到这个目录下,同样的执行了git branch查看分支情况,确 ...

  8. Linux-git安装

    基本操作 安装yum install git 生成SSH KEY :先cd ~/.ssh,在这个目录下输入ssh-keygen,一直回车就可以了,这个时候就会出现id_rsd.pub公钥和id_rsa ...

  9. python flask学习第1天

    flask安装: 第一个flask程序: 用pycharm新建一个flask项目,新建项目的截图如下: app.py代码如下: #从flask这个包中导入Flask这个类 #Flask这个类是项目的核 ...

  10. Linux命令之---rm

    命令简介 rm命令为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当 ...