Java 基础类库之-与用户互动

运行 java程序的参数

我们知道无论任何一个 java 程序想要得到执行,那么必须以某个类的主函数为入口,例如:

public class ArgsTest{
    public static void main(String[] args){
        System.out.println("args 数组的长度是"+args.length);
        for(String arg : args){
            System.out.println(arg);
        }
    }
}           

JVM是怎么处理 args数组参数的?

通过上面的答应结果可以看出 args 是一个长度为0的数组,因为计算机是没有思考能力的,既然用户没有赋值给args[]数组,那么 JVM 也不知道如何 args 数组赋值,所以 JVM 将 args数组设置成一个长度为0的数组.因此默认 args[]数组的长度为0

如果向 args数组添加元素

在运行 一个java程序的时候,我们在终端运行 java ClassName arguments的时候,arguments 就会被 JVM 自动赋值到 args 数组中,当需要想 args[]数组中赋多个值得时候,需要将 arguments 用空格分开,JVM 默认使用空格符作为分隔符. 所以如果参数本身含有空格的时候,需要使用双引号""括起来,例如:
java ArgsTest "java Spring" ,那么程序的输出结果是 :

java Spring

如果运行 java ArgsTest java Spring ,那么输出结果为:

java
Spring

程序的输出长度也分别是1和2

使用 Scanner 获取键盘输入

运行 java 程序传入的参数只能在程序开始之前就设定几个固定的参数.如果我们想要在程序运行时取得输入,那么就需要使用 Scanner 类,我们可以很方便的获取键盘输入,Scanner 类有多个构造器,不同的构造器可以接受文件,输入流,字符串作为数据源,用于从 字符串,文件,输入流中解析数据.Scanner 是一个基于正则表达式的文本扫描器,它可以从文件,输入流和字符串中解析出基本的数据类型和字符串值.

构造方法

  • Scanner(File cource) 构造一个新的 Scanner,它生成的值是从指定的文件扫描的

  • Scanner(InputStream source)构造一个新的 Scanner,它生成的值是从一个指定的输入流中扫描的

  • Scanner (Readable source) 构造一个新的 Scanner ,它生成的值是从一个指定的源中扫描的

  • Scanner(ReadableByteChannel source) 构造一个新的 Scanner ,它生成的值是从一个指定的信道扫描的

  • Scanner(String source)构造一个新的 Scanner,它的值是从一个指定的字符串扫描的

主要方法

  • void close() 关闭此扫描器
  • Pattern delimiter()返回此 Scanner 当前正在用于匹配分隔符的 Pattern
  • String findInLine(Pattern pattern) 试图在忽略分隔符的情况下查找一个指定的模式 pattern
  • int radix() 返回此扫描器默认基数
  • skip(Pattern pattern) 在忽略分隔符的情况下跳过与制定模式匹配的输入信息
  • reset() 重置此扫描器,分隔符也会重置
  • locale()返回当前的语言环境
  • useDelimiter(Pattern pattern) 将此扫描器的分割模式设置为此指定模式
  • Scanner useLocale(Locale locale) 将此扫描器的语言环境设置为指定的语言环境
  • Scanner userRadix(int radix)将此扫描器的默认基数设置为指定基数

在使用 Scanner 的时候,我们最经常实用的还有以下两个方法 hasNextType() Type指的是我们指定的类型(一般是基本数据类型),例如hasNext() ,hasNextByte(),hasNextLine()等,读取一个文件的时候可以使用 hasNextLine() 方法,如果没有制定,则该方法为 hasNext()方法,如果扫描器中存在我们指定的结果,那么返回值为 true.还有一个 nextType(),通过该方法,我们能够获取到输入的值,如果不指定 Type,那么 next()方法返回的值为 String

Scanner为了等待信息的输入,它的读取操作可能被阻塞.如果输入源没有输入结束,Scanner 又读不到更多的输入项时,Scanner 的 hasNext()和 next()方法都有可能阻塞.
String testStr = "1 2 3 4 5 6 \n 7 8 9";
Scanner scanner = new Scanner(testStr);
System.out.println("scanner 的默认分隔符:"+scanner.delimiter());
System.out.println("scanner 的默认 locale :"+scanner.locale());
System.out.println("scanner 的默认 基数 :"+scanner.radix());

    System.out.println("输出扫描器的值:");
    while (scanner.hasNext()) {
        System.out.println(""+scanner.next());
    }

scanner 的默认分隔符:\p{javaWhitespace}+
scanner 的默认 locale :zh_CN
scanner 的默认 基数 :10
输出扫描器的值:
1
2
3

4
5
6
7
8
9

scanner = new Scanner(testStr);
    scanner.useDelimiter("\\n");
    System.out.println("scanner 的默认分隔符:"+scanner.delimiter());
    System.out.println("输出使用分隔符后扫描器的值:");
    while (scanner.hasNext()) {
        System.out.println(""+scanner.next());
    }

scanner 的默认分隔符:\n
输出使用分隔符后扫描器的值:
1 2 3 4 5 6
7 8 9

//      忽略分隔符,使用指定模式
    scanner = new Scanner(testStr);
    scanner.useDelimiter("7");
    System.out.println("scanner 的默认分隔符:"+scanner.delimiter());
    System.out.println("输出忽略分隔符:");
    while (scanner.hasNext()) {
//匹配到结果以后,将当前的结果使用指定的模式进行匹配
// 但第一次匹配结果的时候,匹配结果为 1 2 3 4 5 6 \n ,使用 findLine(pattern)以后,将会按照 pattern 进行匹配,pattern 前的将被丢弃,后的就是 scanner.next()的结果
        System.out.println("-----"+scanner.findInLine("2"));
        System.out.println(""+scanner.next());

    }
    scanner.reset();
    System.out.println("scanner 重置后 的默认分隔符:"+scanner.delimiter());

scanner 的默认分隔符:7
输出忽略分隔符:
-----2
3 4 5 6
-----null
8 9
scanner 重置后 的默认分隔符:\p{javaWhitespace}+

你可能感兴趣的:(Java 基础类库之-与用户互动)