运行 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}+