java 程序在不同的操作系统上运行的时候,可能需要获取平台相关属性,或者调用相关命令来完成特定功能. java提供了System 和 Runtime 供我们使用。
System 类
System 类提供了一些有用的类方法和字段.System 提供了标准的输入,输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库方法,还有快速复制数组的一部分使用方法.
getEnv() 可获得 java 程序运行平台环境变量
public static void printEnv(){
Map<String , String> envs =System.getenv();
for(String envKeys : envs.keySet()){
System.out.println("环境变量 Key:"+envKeys+" :"+"环境变量 value"+envs.get(envKeys));
}
}-
getProperties() 可获得当前运行平台的一些属性,例如: 系统版本 ,java 版本 ,默认字符编码等信息
public static void printProp(){ Properties prop =System.getProperties(); for(String key : prop.stringPropertyNames()){ System.out.println("平台属性 Key:"+key+" :"+"平台属性 value"+ prop.getProperty(key)); } }
currentTimeMillis() 和 nanoTime() 的区别?
上面两个返回的都是一个 long 类型整数,实际上返回的都是当前时间与 UTC 1970 年1月1日午夜的时间差,前者是以毫秒为单位,后者是以纳秒为单位.
-
System 类中 identityHashCode(Obejct obj) 方法,这个方法能够输出一个对象的 hashCode,通常一个类的hashCode()方法返回的是该对象在内存中的地址,也有很多类重写了 hashCode 方法,所以通过obj.hashCode()方法得到的不一定是内存中的地址. identityHashCode(obj)方法返回的就是 obj 对象在内存中的地址,因此只要两个对象调用identityHashCode()方法返回的值一样,那么这两个对象一定是同一个对象,两个对象的 hashCode()方法返回的值一样,这两个对象不一定是同一个对象.
public static void identityHashCode(){ String str1 = new String("System"); String str2 = new String("System"); String str3 = "System"; String str4 = "System"; //两个值 hashCode不同 System.out.println("str1 和 str2"+System.identityHashCode(str1) +" "+System.identityHashCode(str2)); //两个值 hashCode值相同 System.out.println("str3 和 str4"+System.identityHashCode(str3) +" "+System.identityHashCode(str4)); //两个对象不相等 System.out.println("str1 == str2 ?"+(str1 == str2)); //两个对象相等 System.out.println("str3 == str4 ?"+(str3 == str4)); }
String str1 = "123" 和 String str2 = new String("123");
str1被创建以后,对象会放到一个常量池中,当再次创建 "123"变量的时候,会优先去常量池中查找,如果常量池中存在该字符串序列,那么将不会存在新的字符串对象.如果不存在,那么将创建一个新的字符串对象,并放到字符串常量池中. 而 str2 创建的对象存放在堆中,没次使用 new 创建字符串的时候,都会创建一个新的字符串对象.
Runtime 类
每一个 java 程序都有一个 Runtime 类的实例.例如:每一个 android 程序都是在一个单独的虚拟机中执行的,每个虚拟机都是操作系统的一个独立进程.能够是应用程序与运行时环境相连接,我们只能通过 getRuntime 方法获取当前的运行时,应用程序不能够创建自己的 Runtime 实例,Runtime 提供主要有两大功能:
通过 Runtime 我们可以获得运行时环境Java虚拟机的一些 运行时信息
System.out.println("可用处理器数目:"+runtime.availableProcessors());
System.out.println("java 虚拟机的内存总量::"+runtime.totalMemory());
System.out.println("当前空闲的内存:"+runtime.freeMemory());Runtime还可以单独启动一个进程来运行操作系统的命令
//Process process = runtime.exec("ls -al"); //两种方式执行命令
Process process = runtime.exec(new String[]{"ls","-al"});
//命令执行结果我们可以通过接收一个输入流来接收
InputStream inputStream = process.getInputStream();
byte[] b = new byte[1024];
inputStream.read(b);
System.out.println("命令执行结果:"+new String(b));