Java基础19--System--Runtime--Math--Date--Calendar

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xzm_rainbow/article/details/18095813

19-1,API-System类

1,因为System没有构造函数,所以不能被实例化,它里面的方法通常是静态的。

2,System中的字段:

(1)static PrintStream err:标准错误输出流

(2)static InputStream in:标准输入流

(3)static PrintStream out:标准输出流,System.out.println();

3,主要方法:

(1)public static longcurrentTimeMillis()

返回以毫秒为单位的当前时间,其值取决于操作系统,有的操作系统以几十毫秒为单位测量时间。

返回的是当前时间与协调世界时间1970年1月1日午夜之间的时差(以毫秒为单位测量)。

(2)nanoTime()返回系统计时器的当前值,以毫微秒为单位。

以上两个方法可以用来测量一段代码(如循环)的执行时间,如:

long startTime = System.nanoTime();

...code...

long endTime = System.nanoTime();

System.out.println("运行时间为:" +(endTime - startTime) / 1000 + "秒");

(3)exit():退出系统(JVM)。

(4)gc():调用垃圾回收器。

4,重要方法:

public static PropertiesgetProperties()

获取系统的属性信息,并存储到了Properties集合中。

Properties集合中存的都是String类型的键和值。最好使用他自己的存储和取出方法来完成元素的操作。

例如,通过下列代码可以获取系统的属性信息:

public class GetInfo {
	public static void main(String[] args) {
		Properties prop = System.getProperties();
		Set<String> nameSet = prop.stringPropertyNames();
		for(String name : nameSet) {
			String value = prop.getProperty(name);
			System.out.println(name + "::" + value);
		}
	}
}

5,换行符问题

不同的系统的支持的换行符不同,如windows是/r/n,而Unix是/n,Java是跨平台的,那么如何使换行操作在不同的系统上都能正确显示呢?

答:JVM启动时先加载系统信息,可以从中获取当前系统使用的换行符,字段为line.separator,在我们的程序中,有换行操作的地方只要用该字段来获取当前系统的换行符即可,因为获取此值后不再变化,所以用final设置为常量即可。

public class SystemDemo{
	private static final String LINE_SEPARATER = System.getProperty("line.separator");
	public static void main(String[] args) {
		System.out.println("hello - " + LINE_SEPARATER + "world");
	}
}

6,也可以在程序中向系统信息中添加一些信息。那么其他程序可以直接获取并使用,是全局的,它是写到了操作系统的配置文件中。

例如:System.setProperty("myclasspath","c:\myclass");

 

19-2,Runtime类

1,java.lang.Runtime类

每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接,可以通过getRuntime方法获取当前运行时。应用程序不能创建自己的Runtime类实例。

该类没有构造函数,且它的方法大多数也不是静态的。那么这个类肯定有一个静态方法,并返回本类对象。很明显,这个类使用了单例设计模式。

2,方法:

Process exec(String command)

Process是创建了一个进程,exec方法可以打开一个程序,例如记事本,command指令是一个字符串,用于指定程序的路径,运行时,会现在当前类路径下找指定的程序,如果没有找到会到classpath下找,再找不到则报错。

例如:

System.setProperty("myclasspath","c:\myclass");
Process exec(String command)
Runtime r = Runtime.getRuntime();
r.exec("notepad.exe");//打开记事本
r.exec("QQ.exe");//无法打开,路径中没有QQ.exe

也可以指定程序去解析一个文件。

r.exec("notepad.exe c:\\RuntimeDemo.java");//会用记事本打开RuntimeDemo.java文件
Process中的destroy方法用于杀死一个子进程,
Process p = r.exec("notepad.exe");
p.destroy();//关闭notepad进程

 

19-3,Math类

1,java.lang.Math,包含基本数学运算方法,其方法都是静态的。

2,常用方法

(1)abs(...):返回绝对值

(2)cell(...):返回大于参数的最小整数

Math.cell(12.56);//13.0,

(3)floor(...);返回小于参数的最大整数

Math.floor(12.56);//12.0,

(4)round(...);返回四舍五入的值

Math.round(12.56)

(5)pow(double a,double b):返回a的b次幂

Math.pow(2,3);//8

(6)random():返回整的double值,0<=值<1,返回的是伪随机数。

Random示例:

Random r = new Random();
for(int i=0;i<10;i++) {
	double d = Math.cell(Math.random(1*10));//1-10的随机数
	double d = (int)(Math.random() * 6 + 1);//1-6的随机数,骰子
	double d = (int)(r.nextDouble()* 6 + 1);//
}

Random r = new Random();
int d = r.nextInt(6) + 1;//Random类获取伪随机数,模拟骰子

19-4,Date类

1,日期对象和毫秒值之间的转换。

毫秒值-->日期对象:

(1)通过Date对象的构造方法。newDate(毫秒数)

(2)还可以通过setTime设置。

因为可以通过Date对象的方法对该日期中的各个字段进行操作。

日期对象-->毫秒值

getTime方法

因为可以通过具体的数值进行运算。

例如:

Date date = new Date();//将当前日期和时间封装成Date对象
System.out.println(date);
Date date2 = new Date(System.currentTimeMillis());//将指定毫秒值封装成date对象。
System.out.println(date);

 

19-5,日期对象转成字符串

1,使用Calendar类实现日期和时间字段之间的转换,使用DateFormat类来格式化和解析日期字符串。

2,public abstract class DateFormat,不能直接实例化。

DateFormat的格式化风格包括FULL,LONG,MEDIUM,SHORT等,格式化风格就是将时间转化成什么格式。

3,静态工厂,一个类没有构造函数,但可以用这个类中的一个静态方法获取其对象在进行操作,就是静态工厂,比如单例设计模式就是。

myString =DateFormat.getDateInstane().format(myDate);

4,示例:

public static void methodDemo() {
	Date date = new Date();
	//获取日期格式对象,具备默认的风格
	DateFormat dateFormat = DateFormat.getDateInstance();
	String str_date = dateFormat.format(date);
	System.out.println(str_date);
}

5,dateFormat =DateFormat.getDateTimeInstance();

获取日期和时间的实例。

6,getDateInstance(style);获取指定风格的日期实例FULL,LONG,SHORT,MEDIUM。

7,getDateTimeInstance(style)

dateFormat =DateFormat.getDateInstane(DateFormat.LONG);

dateFormat =DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);

8,自定义风格,用SimpleDateFormat类,注意查阅规定的代替符。

dateFormat = newSimpleDateFormat("yyyy--MM-dd");

String str_date =dateFormat.format(date);

System.out.println(str_date);

9,将日期对象转化成日期格式的字符串,使用的是DateFormat中的format()方法。

 

19-6,字符串变成日期对象

将日期格式的字符串转成日期对象,使用的是DateFormat类中的parse()方法。

public static void method()throws ParseException {
	String str_date = "2014-1-10"; //默认风格
	DateFormat dateFormat = DateFormat.getDateInstance();//按默认风格解析
	Date date = dateFormat.parse(str_date);
	System.out.println(date);
}

若要解析LONG风格,即"2014年1月10日",必须在获取对象时指定风格才能解析。

即:DateFormat dateFormat =DateFormat.getDateInstance(DateFormat.LONG);

若要按照自定义风格解析,要创建SimpleDateFormat实例,并正确定义格式。

如:dateFormat = SimpleDateFormat("yyyy---MM---dd");

 

19-7,Date练习

需求:计算2014年1月1日-2014年1月10日之间有多少天。

步骤:

(1)将日期格式字符串转成Date对象。

(2)将Date对象转成毫秒值。

(3)相减,再变成天数。

public class DateTest {
	public static void main(String[] args) {
		String str_date1 = "2014-1-1";
		String str_date2 = "2014-1-10";
		test(str_date1,str_date2);
	}
	public static void test(String str_date1,String str_date2)throws ParseException {
		//1.当日期字符串转成日期对象
		//定义日期格式对象
		DateFormat dateFormat = DateFormat.getDateInstance();
		dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		Date date1 = dateFormat.parse(str_date1);
		Date date2 = dateFormat.parse(str_date2);
		long time1 = date1.getTime();
		long time2 = date2.getTime();
		long time = Math.abs(time1-time2);
		int day = getDay(time);
		System.out.println(day);
	}
	private static int getDay(long time) {
		int day = (int)(time/1000/60/60/24);
		return day;
	}
}

19-8,Calendar类-基本演示

可以将Calendar简单理解为日历。可以做很多Date能做的事情。

这个类也是通过getInstance方法获取Calendar对象的,单例设计模式。

下面演示一下他的基本用法:

public class Demo {
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		showDate(c);
	}
	public static void showDate(Calendar c) {
		int year = c.get(Calendar.YEAR);
		int month = c.get(Calendar.MONTH)+1;//从0开始,到11,所以+1
		int day = c.get(Calendar.DAY_OF_MONTH);
		int week = c.get(Calendar.DAY_OF_WEEK);
		System.out.println(year+"年"+month+"月"+day+"日"+getWeek(week));
	}
	public static String getWeek(int i) {
		String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
		return weeks[i];
	}
}

 

19-9,Calendar类-练习

1,set方法,设置日期。

c.set(2013,10,11);//设置当前Calendar对象c为2013年11月11日,因为月是从0开始的,所以设置10其实是第11月。

2,add方法:可以引起时间的偏移

c.add(Calendar.YEAR,2);在当前c对象时间的基础上加两年,-2是减两年。例如当前Calendar对象是2014年1月10日,加2年后是2016年1月10日。

3,c.set(2013,11,20)

c.add(Calendar.MONTH,2);//2014年2月20日

4,练习

输入一个年份,判断他的二月有几天。

这是个闰年的问题,之前需要通过一定的算法计算,这里用Calendar类解决。

加入输入的是2014年。

public class Test {
	public static void main(String[] args) {
		int year = 2014;
		showDays(year);
	}
	public static void showDays(int years) {
		Calendar c = Calendar.getInstance();
		c.set(year,2,1);//将c设置成为某年的3月1日。
		c.add(Calendar.DAY_OF_MONTH,-1);
		showDate(c);
	}
	public static void showDate(Calendar c) {
		int year = c.get(Calendar.YEAR);
		int month = c.get(Calendar.MONTH)+1;//从0开始,到11,所以+1
		int day = c.get(Calendar.DAY_OF_MONTH);
		int week = c.get(Calendar.DAY_OF_WEEK);
		System.out.println(year+"年"+month+"月"+day+"日"+getWeek(week));
	}
}


猜你喜欢

转载自blog.csdn.net/xzm_rainbow/article/details/18095813