java_main
Java中用户向系统传递参数的三种基本方式
main方法
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等。
这个main()方法的声明为:public static void main(String args[])。必须这么定义,这是Java的规范。
为什么要这么定义,和JVM的运行有关系。
当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。
由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。
对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。
main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类细必须String[],至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。
因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[])”。
main()方法中字符串参数数组作用是接收命令行输入参数的,命令行的参数之间用空格隔开。
public class HelloWorld2 {
static {
System.out.println("Hello Wordld!");
}
public static void main(String args[]){
System.exit(0);
}
}
这个main()方法执行的内容就一句"System.exit(0);" ,目的是让程序正常结束。那“HelloWorld!”是从哪里打印的,秘密就是在static打印的,因为static代码块的内容会在main调用前调用。
第一种通过main方法传递
public class MainArgs { public static void main(String[] args) { System.out.println(args.length); for(String str : args){ System.out.println(str); } } }
在运行 java程序后面跟的字符串(一个或多个用空格隔开)jvm将会把这些一个或多个字符串赋给args数组。当字符串中包含空格时则需要将完整的一个字符串用“”括起来。
执行时
C:\Users\fgy>javac MainArgs.java
C:\Users\fgy>java MainArgs we fie ow
3
we
fie
ow
第二种使用scanner类
使用Scanner类进行用户输入:可以输入用户指定的数据类型
Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
1 import java.util.Scanner; 2 import java.io.File; 3 public class ScannerKeyBoardTest 4 { 5 public static void main(String[] args) throws Exception 6 { 7 //readFileCon(); 8 //test2(); 9 10 //通过键盘输入指定类型 11 Scanner scan = new Scanner(System.in); 12 Long l = scan.nextLong(); 13 System.out.println("l is "+l); 14 } 15 //读取任何的数据输入返回String 16 public static void test1(){ 17 Scanner scan = new Scanner(System.in); 18 19 //使用 回车键 作为分隔符 默认使用 空格 制表键 回车作为分割付。 20 //scan.useDelimiter("\n"); 21 while(scan.hasNext()){ 22 System.out.println("next is " + scan.next()); 23 } 24 } 25 26 //读取Long型数据的输入返回Long 27 public static void test2(){ 28 Scanner scan = new Scanner(System.in); 29 //当输入的为 非 Long数值时 推出循环 30 while(scan.hasNextLong()){//阻塞式 31 //System.out.println("has over scan.nextLong() begin...."); 32 System.out.println("next is " + scan.nextLong()); 33 //System.out.println("scan.nextLong() over has begin...."); 34 } 35 } 36 //读取文件中的内容 并打印到控制台 37 public static void readFileCon()throws Exception 38 { 39 Scanner scan = new Scanner(new File("ScannerKeyBoardTest.java")); 40 System.out.println("fileContent is:"); 41 while(scan.hasNextLine()){ 42 System.out.println(scan.nextLine()); 43 } 44 } 45 }
第三种是使用BufferedReader类读取用户的输入:返回的只能是String类
1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 class BufferReaderKeyBoardTest 4 { 5 public static void main(String[] args) throws Exception 6 { 7 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 8 String in = null; 9 while((in = br.readLine()) != null){ 10 System.out.println("用户输入的是: "+in); 11 } 12 } 13 }
System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
1. java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
2. 从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。
3. System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
1 package ysu.hxy; 2 import java.util.*; 3 import java.io.*; 4 5 public class BufferedReaderWriterDemo 6 { 7 public static void main(String[] args) 8 { 9 try 10 { 11 //缓冲System.in输入流 12 //System.in是位流,可以通过InputStreamReader将其转换为字符流 13 BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in)); 14 //缓冲FileWriter 15 BufferedWriter bufWriter = new BufferedWriter(new FileWriter(args[0])); 16 17 String input = null; 18 19 //每读一行进行一次写入动作 20 while(!(input = bufReader.readLine()).equals("quit")) 21 { 22 bufWriter.write(input); 23 //newLine()方法写入与操作系统相依的换行字符,依执行环境当时的OS来决定该输出那种换行字符 24 bufWriter.newLine(); 25 } 26 bufReader.close(); 27 bufWriter.close(); 28 } 29 catch(ArrayIndexOutOfBoundsException e) 30 { 31 System.out.println("没有指定文件"); 32 } 33 catch(IOException e) 34 { 35 e.printStackTrace(); 36 } 37 } 38 }
编译运行上面的程序
D:\hxy>java ysu.hxy.BufferedReaderWriterDemo test2.txt
111111111111
222222222222
quit
会在目录下产生一个文件test2.txt,并在其中写入刚才输入的内容。