java其他对象(System&Runtim&Date&Calendar&Math-Random)

本文内容是根据毕晓东老师的视频教程总结而得。包括System、Runtime、Date、Calendar、Math-Random等java基础知识。

1.System

System包含一些有用的字段和方法,不能被实例化。成员属性和方法全部被静态修饰。

  • 有标准输入、标准输出、错误输出流;
  • 对外部定义的属性和环境变量的访问;
  • 加载文件和库的方法;
  • 快速复制数组arrayCopy的一部分的使用方法;

in :标准输入,默认获取键盘录入

out :标准输出,打印到控制台

方法:

  • arrayCopy():复制数组
  • exit():终止当前正在执行的Java虚拟机
  • currentTimeMillis():获取当前时间(毫秒)
  • gc():垃圾回收器
  • 描述系统信息:static Properties getProperties():获取当前的系统属性

因为Properties是HashTable的子类,也就是Map集合中的一个子类对象,所以可以通过map的方法取出该集合中的元素。Properties集合中存储的都是字符串,没有泛型定义。

package com.vnb.javabase.base.otherobject;

import java.util.Properties;

public class SystemDemo {

   public static void main(String[] args) {

      Properties prop = System.getProperties();

      for(Object obj : prop.keySet()){

         String value = (String)prop.get(obj);

         System.out.println(obj+"::"+value);

      }

   }

}

结果:

java.runtime.name::Java(TM) SE Runtime Environment

sun.boot.library.path::C:\Program Files\Java\jdk1.8.0_171\jre\bin

java.vm.version::25.171-b11

……

sun.desktop::windows

sun.cpu.isalist::amd64

以上为虚拟机在启动时默认加载的信息。

怎么做到,系统启动时,设置某些特定的属性信息让其一致存在于系统级属性中?

package com.vnb.javabase.base.otherobject;

import java.util.Properties;

public class SystemDemo {

   public static void main(String[] args) {

      Properties prop = System.getProperties();

      //在系统中设置自定义的特有信息setProperty()

      System.setProperty("myKey", "myvalue");

      for(Object obj : prop.keySet()){

         String value = (String)prop.get(obj);

         System.out.println(obj+"::"+value);

      }

   }

}

获取指定属性信息:

String value = System.getProperty("os.name");

结果:value:Windows 7

获取系统不存在的属性信息会返回null:

String v = System.getProperty("hh");

      System.out.println("v:"+v);

结果:

v:null

可否在虚拟机启动时动态给系统属性设置值?

虚拟机启动,使用命令 java –Dkey=value 类名,即可。如Tomcat服务器启动时就给其加上某些系统级的信息。

2.Runtime

每个Java应用程序都有一个Runtime类的实例,允许应用程序与运行应用程序的环境(所在的系统)进行相连接。应用程序无法创建自己的此类的实例(没有构造函数)。不让创建对象,应该要提供可访问的静态方法和能返回本类对象的运行时对象才行,但是Runtime类里的方法都是非静态的,所以只能通过getRuntime方法获得当前运行时对象(单例设计模式)。

该类中并没有提供构造函数,说明不可以new对象,会直接想到该类中的方法都是静态的,但是发现该类中还有非静态方法,说明该类肯定会提供方法用于获取本类对象,并且该方法是静态的,并且返回值类型是本类类型。该方法即static Runtime getRuntime()。有这个特点可以看出该类使用了单例模式完成。

Process exec(String command):在单独的进程中执行指定的字符串命令。

package com.vnb.javabase.base.otherobject;

import java.io.IOException;

public class RuntimeDemo {

   public static void main(String[] args) {

      Runtime r = Runtime.getRuntime();

      try {

        r.exec("D:/FileZilla/FileZilla FTP Client/filezilla.exe");

      } catch (IOException e) {//没有这个程序就会捕捉异常

         e.printStackTrace();

      }

   }

}

结果:程序正常打开

当把硬盘里指定目录下没有,会去系统环境变量里找,这里面再没有就失败。

这个方法的返回值Process是抽象的,所以其应该有子类为我们所用。因为调用程序不是我们去调用,而是调用底层资源去操作这个程序的进程。所以就定义抽象类,因为有底层做实现调用系统平台的功能。其中Process类有destroy()方法用于杀掉子进程。

只能杀掉由其调用的进程,其他的进程杀不了。

可以将一个文件通过一个程序打开。

3.Date

Date类表示特定的时间,精确到毫秒。

Date类的具体格式化操作类:java.text.SimpleDateFormat;

4.Calendar

单独获取Date时间的年月日。

对于Date获取年份,可以通过SimpleDateFormat直接获取。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy");

       String year = sdf.format(d);

但是发现如果要对获取的年份进行计算,必须得进行转化,于是有了Calendar类可以直接操作Date的年。计算机计算月份从0开始,范围:0-11

package com.vnb.javabase.base.otherobject;

import java.util.Calendar;

public class CalendarDemo {

   public static void sop(Object obj){

      System.out.println(obj);

   }

   public static void main(String[] args) {

      Calendar c = Calendar.getInstance();

      sop(c.get(Calendar.YEAR)+"年");

      //查表法

      String[] mons = {"1","2","3","4",

            "5","6","7","8","9",

            "10","11","12"};

      int index = c.get(Calendar.MONTH);

      sop(mons[index]);

      sop(c.get(Calendar.DAY_OF_MONTH)+"");

      String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

      int week = c.get(Calendar.DAY_OF_WEEK);

      sop(weeks[week]);

   }

}

结果:对于日期(+1)和星期(-1)的值不符合现实生活习惯,可通过查表法进行解决。

java.util.GregorianCalendar[time=1536304971745,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=8,WEEK_OF_YEAR=36,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=250,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=22,SECOND=51,MILLISECOND=745,ZONE_OFFSET=28800000,DST_OFFSET=0]

2018

9

7

星期五

想对实例的时间进行重新设定:

set(int y,int m,int d)

add(int field,int amount):根据日历规则,为给定日历字段添加或减去指定的时间量。

package com.vnb.javabase.base.otherobject;

import java.util.Calendar;

public class CalendarDemo2 {

   public static void sop(Object obj){

      System.out.println(obj);

   }

   public static void main(String[] args) {

      Calendar c = Calendar.getInstance();

      c.set(2014, 2, 23);

      printCalendar(c);

      c.add(Calendar.YEAR, 4);

      c.add(Calendar.MONTH, 5);

      //时间是连续的,往回减一个月

      c.add(Calendar.MONTH, -1);

      printCalendar(c);

   }

   public static void printCalendar(Calendar c){

      sop(c);

      sop(c.get(Calendar.YEAR)+"");

      //查表法

      String[] mons = {"1","2","3","4",

            "5","6","7","8","9",

            "10","11","12"};

      int index = c.get(Calendar.MONTH);

      sop(mons[index]);

      sop(c.get(Calendar.DAY_OF_MONTH)+"");

      String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

      int week = c.get(Calendar.DAY_OF_WEEK);

      sop(weeks[week]);

   }

}

结果:

2014

3

23

星期日

 

2018

7

23

星期一

 

练习:

1.获取任意年的二月有多少天:

根据指定年设置一个时间就是c.set(year,2,1)(设置某一年的3月1日)

c.add(Calendar.DAY_OF_MONTH,-1);//3月1日,往前推一天,就是2月最后一天

2.获取昨天的现在这个时刻:

   c.add(Calendar.DAY_OF_MONTH,-1)

5.Math-Random

Math类用于执行基本数学运算的方法。

  • static double abs(double d) 返回绝对值
  • static double ceil(double d) 返回大于或等于参数的最小(最接近负无穷大) double值,等于一个数学整数。
  • floor() 返回小于指定数据的最大整数
  • round()四舍五入
  • pow()次方

package com.vnb.javabase.base.otherobject;

public class MathDemo {

   public static void main(String[] args) {

       double d = Math.ceil(16.34);

       sop("ceil--正数d="+d);

       //ceil返回大于或等于指定数据的最小整数

       double d1 = Math.ceil(-16.34);

       sop("ceil负数--d1="+d1);

       //floor返回小于指定数据的最大整数

       double d2 = Math.floor(16.34);

       sop("floor--d2="+d2);

       //四舍五入

       long l = Math.round(d);

       sop("round--d2="+d2);

       //次方

       double d3 = Math.pow(2, 3);

       sop("pow--d3="+d3);

   }

   public static void sop(Object obj){

      System.out.println(obj);

   }

}

结果:

ceil--正数d=17.0

ceil负数--d1=-16.0

floor--d2=16.0

round--d2=16.0

pow--d3=8.0

随机函数 Random:double random():返回带正号的double值,该值大于等于0.0且小于1.0。返回值是一个伪随机(借助算法生成的随机数生成器)选择的数。

(int)Math.random()*10+1 表示0到10不包括10。

package com.vnb.javabase.base.otherobject;

import java.util.Random;

public class RandomDemo {

   public static void main(String[] args) {

      for (int i = 0; i < 5; i++) {

         int d = (int)(Math.random()*10+1);

         sop("Math.random():"+d);

      }

      Random r = new Random();

      for (int i = 0; i < 5; i++) {

         int d = r.nextInt(5)+1;

         sop("Random:"+d);

      }

   }

   public static void sop(Object obj){

      System.out.println(obj);

   }

}

结果:

Math.random():2

Math.random():6

Math.random():1

Math.random():6

Math.random():7

Random:5

Random:2

Random:2

Random:3

Random:3

Random类和Math.random()用法类似,但是Random更方便。