简介

程序经常从命令行运行并与在命令行环境中的用户交互。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. linux 命令——49 at (转)

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  2. Python核心编程——多线程threading和队列

    线程与进程类似不过他们是在同一个进程下执行的,并共享相同的上下文.可以将他们认为是在一个主进程或“主线程”中运行的迷你进程. 线程包括开始.执行顺序和结束三部分.它有一个指令指针,用于记录当前运行的上 ...

  3. python 线程even

    import threading,time import random def door(nums): num=1#电梯在一楼 while True: print("this door is ...

  4. 《javascript 学习笔记》

    注释 1. // This is an in-line comment. 2. /* This is a  multi-line comment */ 七种data types(数据类型) undef ...

  5. 03_15_interface

    03_15_interface 1. 接口 接口是抽象方法和常量值的定义的集合. 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现. 2. 接口特性 接口 ...

  6. java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

    package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如 ...

  7. AngularJS最佳实践

    1.依赖注入不要用推断式 2.双向绑定的变量设置成$scope下的一个对象的属性 3.多个控制器之间的通信尽量使用service实现,不要使用全局变量或者$rootScope 4.尽量不在控制器中操作 ...

  8. 全文检索ES 服务启动和关闭

    nohup ./elasticsearch &  可以后台开启elasticsearch服务 ps-ef列出所有进程 ps-ef | grep elastic...查找elastic..的进程 ...

  9. Python_循环判断表达式

    一.if判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. if判断结构: if 条件: 动作 elif 条件: 动作 else: 动作 if判断年龄: age_of_princal ...

  10. Python导入模块方法

    import module_name 导入整个模块 from module_name import function_name 导入特定函数 from module_name import funct ...