与运行环境交互

运行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");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值