运行Java程序的参数
Java程序的入口——main方法的方法签名解析
public static void main(String[] args) {}
- public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main方法,所以使用public修饰符把这个方法暴露出来。
- static修饰符:JVM调用这个主方法时,不会先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过该类来调用主方法,因此使用static修饰该主方法。
- void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main方法没有返回值。
上面方法中还包括一个字符串数组形参,根据方法调用的规则:谁调用方法,谁负责为形参赋值。也就是说,main方法由JVM调用,即args形参应该由JVM负责赋值。
public class ArgsTest {
public static void main(String[] args) {
//输出args数组的长度
System.out.println(args.length);
//遍历args数组的每个元素
for (String arg : args){
System.out.println(arg);
}
}
}
我们运行上面的程序输出结果为0,因为我们在运行该程序的时候没有给JVM传参
如果是在开发工具中传参方式如下图
使用Scanner获取键盘输入
运行java程序时传入参数只能在程序开始运行之前就设定几个固定的参数。对于更复杂的情形,程序需要在运行过程中取得输入,这时就需要用到Scanner扫描器了
使用Scanner类可以很方便地获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可以接收文件、输入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。
public class ScannerKeyBoardTest {
public static void main(String[] args) {
//System.in代表标准输入,就是键盘输入
Scanner sc = new Scanner(System.in);
//增加下面一行将只把回车作为分隔符
sc.useDelimiter("\n");
//判断是否还有下一个输入项
while (sc.hasNext()){
//输出输入项
System.out.println("键盘输入的内容是:" + sc.next());
}
}
}
sc.useDelimiter("\n");
此行代码是把回车作为分隔符,程序会把键盘的每行输入当成一个输入项,不会以空格、Tab空白等作为分隔符
public class ScannerLongTest {
public static void main(String[] args) {
//System.in代表标准输入,就是键盘输入
Scanner sc = new Scanner(System.in);
//判断是否还有下一个long整数
while (sc.hasNextLong()){
//输出输入项
System.out.println("键盘输入的内容是:" + sc.nextLong());
}
}
}
1
键盘输入的内容是:1
22222
键盘输入的内容是:22222
2.3
Process finished with exit code 0
上面程序要求键盘输入必须是整数,否则程序就会退出
使用BufferedReader获取键盘输入
Scanner可以非常方便地获取键盘输入,它是java5新增的工具类。在java5之前,程序通常通过BufferedReader类来读取键盘输入。
BufferedReader是java IO流中的一个字符包装流,它必须建立在另一个字符流的基础之上。但标准输入System.in是字节流,程序需要使用转换流InputStreamReader将其包装成字符流。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public class KeyboardInTest {
public static void main(String[] args) throws Exception{
//以System.in字节流为基础,创建一个BufferedReader对象
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
//逐行读取键盘输入
while ((line = br.readLine()) != null){
System.out.println("用户键盘输入的是:" + line);
}
}
}
效果如下
haha
用户键盘输入的是:haha
nihao he ll
用户键盘输入的是:nihao he ll
系统相关
java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。java提供了System类和Runtime类来与程序的运行平台进行交互
System类
System类代表当前java程序的运行平台
public class SystemTest {
public static void main(String[] args) throws Exception{
//获取系统所有的环境变量
Map<String,String> env = System.getenv();
for (String name : env.keySet()){
System.out.println(name + "——>" + env.get(name));
}
//获取指定环境变量的值
System.out.println(System.getenv("JAVA_HOME"));
//获取所有的系统属性
Properties props = System.getProperties();
//将所有的系统属性保存到props.txt文件中
props.store(new FileOutputStream("props.txt"), "System Properties");
//输出特定的系统属性
System.out.println(System.getProperty("os.name"));
}
}
上面程序通过调用System类的getenv()、getProperties()、getProperty等方法来访问程序所在平台的环境变量和系统属性,程序运行的结果会输出操作系统所有的环境变量值,并输出JAVA_HOME环境变量,以及os.name系统属性的值。
System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法就不能唯一地标识该对象;但通过identityHashCode()方法返回的hashCode值,依然是根据该对象的地址计算得到的hashCode值。所以,如果两个对象的identityHashCode值相同,则两个对象绝对是同一个对象。
public class IdentityHashCodeTest {
public static void main(String[] args) {
//下面程序中s1和s2是两个不同的对象
String s1 = new String("Hello");
String s2 = new String("Hello");
//String 重写了hashCode()方法-改为根据字符序列计算hashCode值
//因为s1和s2的字符序列相同,所以它们的hashCode()方法返回值相同
System.out.println(s1.hashCode() + "----" + s2.hashCode());
//s1和s2是不同的字符串对象,所以它们的identityHashCode值不同
System.out.println(System.identityHashCode(s1) + "----" + System.identityHashCode(s2));
String s3 = "Java";
String s4 = "Java";
//s3和s4是相同的字符串对象,所以它们的identityHashCode值相同
System.out.println(System.identityHashCode(s3) + "----" + System.identityHashCode(s4));
}
}
Runtime类
Runtime类代表java程序的运行时环境,每个java程序都有一个与之对应的
Runtime实例,应用程序通过该对象与其运行时环境相连。
Runtime类代表java程序的运行时环境,可以访问JVM的相关信息,如处理器数量、内存信息等。
public class RuntimeTest {
public static void main(String[] args) {
//获取java程序关联的运行时对象
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量:" + rt.availableProcessors());
System.out.println("空闲内存数:" + rt.freeMemory());
System.out.println("总内存数:" + rt.totalMemory());
System.out.println("可用最大内存数:" + rt.maxMemory());
}
}
处理器数量:4
空闲内存数:126248208
总内存数:128974848
可用最大内存数:1892155392
除此之外,Runtime类还有一个功能,它可以直接单独启动一个进程来运行操作系统的命令
public class ExecTest {
public static void main(String[] args) throws Exception{
Runtime rt = Runtime.getRuntime();
//运行记事本程序
rt.exec("D:\\Program Files (x86)\\Notepad++\\notepad++.exe");
}
}