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更方便。