zoukankan      html  css  js  c++  java
  • IO Streams:来源于命令行的IO

    简介

    程序经常从命令行运行并与在命令行环境中的用户交互。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,用空格覆盖旧的密码。

  • 相关阅读:
    AMQP协议
    设计模式三:行为型模式
    设计模式二:结构型模式
    设计模式一:创建型模式
    算法进阶
    数据结构
    希尔排序、计数排序、桶排序、基数排序
    归并排序
    python Gevent协程
    python——多进程
  • 原文地址:https://www.cnblogs.com/hhx626/p/8320409.html
Copyright © 2011-2022 走看看