黑马程序员——015——其他对象(System、Runtime、Date、Calendar、Math、Random)

来源:互联网 发布:众途软件多少钱 编辑:程序博客网 时间:2024/05/19 20:57
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

System
首先先从我们已经用到烂掉的对象System开始;
System:类中的方法和属性都是静态的;
—out:表示标准输出,默认就是控制台,因此我们使用System.out.println();会在控制台打印内容;
—in:表示标准输入,可以暂且认为是键盘。
方法:
—static long currentTimeMillis()
——返回以毫秒为单位的当前时间。
—static void exit(int status)
——终止当前正在运行的 Java 虚拟机。
—static void gc()
——运行垃圾回收器。
—static Properties getProperties()
——确定当前的系统属性。我们稍后的小节再详细讲解这个Properties类;
——这里只给出一个实例代码:
———————————————————————————

import java.io.*;//玩IO流一般都需要导入这个包import java.util.*;//Properties类在这个包中class Demo15_1{        public static void main(String[] args)        {                Properties pro = System.getProperties();                //因为pro试试hashTable的子类 也就是map集合的一个子类对象                //那么可以通过map的方法取出该集合中的元素                //该集合中存储的都是字符串 没有泛型定义                for(Object obj : pro.keySet())                {                        String value = (String)pro.get(obj);                        System.out.println(obj+"::"+value);                }                // 这个程序每一次启动都会获取系统的属性信息        }}

———————————————————————————
运行结果打印出了系统的很多信息,比如说:
—用户执行该程序的路径:
——user.dir::….
—是什么操作系统
——os.name::Windows XP
—编码表
——file.encoding::GBK
—等等.
———————————————————————————
使用这个方法打印出来也可以:
—Set stringPropertyNames()
——返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
—使用Object setProperty(String key, String value)
——调用 Hashtable 的方法 put。
——可以自定义设置值,在任何应用都能够用了;实例代码:
———————————————————————————

import java.io.*;//玩IO流一般都需要导入这个包import java.util.*;//Properties类在这个包中class Demo15_2{        public static void main(String[] args)        {                System.setProperty("mykey","myvalues"); //设置自定义键值属性                Properties pro = System.getProperties();                //因为pro是hashTable的子类 也就是map集合的一个子类对象                //那么可以通过map的方法去除该集合中的元素                //该集合中存储的都是字符串 没有泛型定义                for(Object obj : pro.keySet())                {                        String value = (String)pro.get(obj);                        System.out.println(obj+"::"+value);                }                // 这个程序每一次启动都会获取系统的属性信息        }}

———————————————————————————
执行结果:
这里写图片描述
应用:
—当我们写的程序需要固定读或者使用到某一个路径的时候,我们可以通过这种方式传进去;
———————————————————————————
通过System的getProperties(键)方法能够获取该键对应的值;
应用:
—win2003,win2008,Linux运行都不一样,那么就可以根据判断执行相应的命令。有些应用不支持某些系统就可以这么来做!
———————————————————————————
如果现在想获取的属性比较特殊!
—可不可以在虚拟机启动时动态加载属性值:
——cmd下输入java,查看说明我们会发现使用java 一个参数命令即可:
实例:
我们使用以下命令运行第一个实例Demo15_1的程序:
java -Dhaha=qqqqq Demo15_1
———————————————————————————
执行结果:我们能够发现也被加载进去,并且能够被获取到了。
这里写图片描述
应用:
—Tomcat服务器启动的会后,会使用以这种方式往里面加载一些东西;
———————————————————————————
———————————————————————————
Runtime
Runtime,运行时:
—每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。应用程序是不能创建自己的 Runtime 类实例的。
—查文档,发现没有构造函数(说明不可以new对象),继而想到该类中方法是静态的,而方法又不是静态的。不让建对象,却又有非静态方法。
—所以应该有方法可以获取到改类实例。
——往下找发现这个方法:
———static Runtime getRuntime()
————返回与当前 Java 应用程序相关的运行时对象。
————应用程序执行Runtime就创建了,我们只需要用这个方法就可以获取到了!
————这应该想到:设计模式,单例模式。
—方法不挨个讲,不常用,常用的
——Process exec(String command)
———在单独的进程中执行指定的字符串命令。
——实例:
———————————————————————————
Runtime r = Runtime.getRuntime();
r.exec(“c:\winmine.exe”);//由于路径是可能写错的,所以有异常需要处理,抛IO异常,这里为了方便直接抛最大的exception。
———————————————————————————
r.exec(“winmine.exe”);//c:\删了还能打开,原因:我的电脑 环境变量配置了扫雷程序所在的文件夹路径;
———————————————————————————
exec方法返回值是
—java.lang.Process类
—为抽象类public abstract class Processextends Object
——方法全是抽象的,这个类应该有子类,但是没有子类。因为底层为我们做了实现方式,用即可。
—需要注意的方法:
——abstract void destroy()
———杀掉子进程。
———实例代码:
———————————————————————————

class Demo15_3{        //这里方法直接把异常扔给虚拟机了        public static void main(String[] args) throws Exception        {                Runtime r = Runtime.getRuntime();                Process p = r.exec("notepad.exe");//会抛IO异常                p.destroy();        }}

———————————————————————————
基本上的秒杀,我们看不到记事本被打开的过程,就被关掉了!
为了看到过程,我们让p.destroy();延迟执行:
———————————————————————————

class Demo15_4{        public static void main(String[] args) throws Exception        {                Runtime r = Runtime.getRuntime();                Process p = r.exec("notepad.exe");//会抛IO异常                Thread.sleep(3000);//延迟3秒再杀掉进程                p.destroy();        }}

———————————————————————————
注意:这个方法只能杀现创建出来的进程,而不能杀别的进程。
我们还可以通过修改exec方法参数里面的串的格式,让记事本打开一个文本文件:
———————————————————————————

class Demo15_5{        public static void main(String[] args) throws Exception        {                Runtime r = Runtime.getRuntime();                Process p = r.exec("notepad.exe Demo15_5.java");//会抛IO异常        }}

———————————————————————————
执行的结果是记事本打开,里面是文本文件“Demo15_5.java的内容”;
这里我们可以继续拓展:
—如果“notepad.exe”跟电影文件路径,打开电影文件当然也是可以,电影文件是二进制数据,所以就首先查GBK表,然后将一些乱码显示上去!
—那么我们就应该能想到如果是个播放器程序,后面跟的是电影的地址,那就打开电影了!
—— Process p = r.exec(“player.exe 电影.mp4”);
———————————————————————————
———————————————————————————
Date
Date类是在util包下,开发中我们会有需求就是要求记录什么时间执行的什么操作,时分秒都分割出来操作的比较方便,因此Date类应运而生;
—查CHM有一些过时构造方法,剩俩不过时的(我们的文档是JDK1.6版本的);
——我们看到Date类的API描述的“另请参见”位置的“DateFormat”,我们跟进去看看这个“DateFormat”;
——点DateFormat进去发现其有这个format方法:
这里写图片描述
————但是这个类却不能创建对象:
——往下看发现有个SimpleDateFormat子类;但是注意这个类是在java.text包中了;
———SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
使用如下的一些字母来进行格式化:
这里写图片描述
我们用一个实例代码演示一下:
———————————————————————————

import java.util.*;import java.text.*;class Demo15_6{        public static void main(String[] args)        {                //新建一个Date对象                Date d = new Date();                System.out.println(d);//打印的时间看不懂,                //我们希望按照我们了解的格式进行显示                //将模式封装到SimpleDateFormat对象中                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");                //调用format方法让模式格式化指定Date对象                String time = sdf.format(d);                System.out.println("time="+time);        }}

———————————————————————————
执行结果:
这里写图片描述
如果我们不光想格式化时间,我们还想要单独获取其中的年月日的话;
看下面实例代码:
———————————————————————————

import java.util.*;import java.text.*;class Demo15_7{        public static void main(String[] args)        {                //新建一个Date对象                Date d = new Date();                System.out.println(d);//打印的时间看不懂,                //我们希望按照我们了解的格式进行显示                //将模式封装到SimpleDateFormat对象中,只显示年                SimpleDateFormat sdf = new SimpleDateFormat("yyyy");                //调用format方法让模式格式化指定Date对象                String time = sdf.format(d);                System.out.println("time="+time);        }}

———————————————————————————
执行结果:
这里写图片描述
当然我们可以发现Date类(util包中的),有一个getYear方法,但是已经过时了,API的描述是:
— 从 JDK 1.1 开始,由 Calendar.get(Calendar.YEAR) - 1900 取代。
———————————————————————————
———————————————————————————
Calendar
Calendar是一个抽象类,在Java中某一时刻的信息用非常多的东西描述着,如下图代码的执行结果:
这里写图片描述
其中我们能够看出一些信息,比如说:
—“WEEK_OF_YEAR表示”R表示一年中的第几周;
—“MONTH”表示月份,是0开始;
—“DAY_OF_WEEK”表示星期中的第几天,老外是用1表示星期天(Java是老外发明的)。
实例代码:
———————————————————————————

import java.util.*;class Demo15_8{        public static void main(String[] args)        {                //获取Calendar的一个实例                Calendar c = Calendar.getInstance();                //通过使用get方法传入一个常量参数获取年份                System.out.println(c.get(Calendar.YEAR)+"年");                System.out.println("这周是今年第"+c.get(Calendar.WEEK_OF_YEAR)+"周");                System.out.println(c.get(Calendar.MONTH)+1+"月");                System.out.println("今天是星期"+c.get(Calendar.DAY_OF_WEEK));        }}

———————————————————————————
执行结果:
这里写图片描述
最后一个因为老外用1表示星期日,因此2就表示星期一。而我们在写这个程序的时候是星期一;
我们可以使用“查表法”来对程序进行完善;
———————————————————————————

import java.util.*;class Demo15_9{        public static void main(String[] args)        {                //定义星期文字的中字符串数组(表)                String[] dayArr = {"星期日","星期一","星期二",                        "星期三","星期四","星期五","星期六",};                //定义月份文字的中字符串数组(表)                String[] monthArr = {"一","二","三",                        "四","五","六","七","八","九",                        "十","十一","十二"};                //获取Calendar的一个实例                Calendar c = Calendar.getInstance();                //通过使用get方法传入一个常量参数获取年份                System.out.println(c.get(Calendar.YEAR)+"年");                System.out.println("这周是今年第"+c.get(Calendar.WEEK_OF_YEAR)+"周");                System.out.println(monthArr[c.get(Calendar.MONTH)]+"月");                //由于星期不是从0开始,而是从1开始,因此减去1                System.out.println("今天是星期"+dayArr[c.get(Calendar.DAY_OF_WEEK)-1]);        }}

———————————————————————————
执行结果:
这里写图片描述
———————————————————————————
我们可以对日期进行加减得到另一个日期,使用的方法是Calendar的add方法:
————————————————————
—abstract void add(int field, int amount)
——根据日历的规则,为给定的日历字段添加或减去指定的时间量。
————————————————————
实例代码:
———————————————————————————

import java.util.*;class Demo15_10{        public static void main(String[] args)        {                //定义星期文字的中字符串数组(表)                String[] dayArr = {"星期日","星期一","星期二",                        "星期三","星期四","星期五","星期六",};                //定义月份文字的中字符串数组(表)                String[] monthArr = {"一","二","三",                        "四","五","六","七","八","九",                        "十","十一","十二"};                //获取Calendar的一个实例                Calendar c = Calendar.getInstance();                //通过使用get方法传入一个常量参数获取年份                System.out.println(c.get(Calendar.YEAR)+"年");                c.add(Calendar.YEAR,4);//当前年份再加4年                //打印加了4年后的年份                System.out.println(c.get(Calendar.YEAR)+"年");//打印2019年                //通过使用get方法传入一个常量参数获取月份                System.out.println(monthArr[c.get(Calendar.MONTH)]+"月");                c.add(Calendar.MONTH,4);//当前月份再加4月                //打印加了4月后的月份                System.out.println(monthArr[c.get(Calendar.MONTH)]+"月");//打印十二月                //通过使用get方法传入一个常量参数获取当前月份的日期                System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");                c.add(Calendar.DAY_OF_MONTH,-4);//当前月份的日期再减4天                //打印减了4天后的月份                System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");//        }}

———————————————————————————
执行结果:(写这小节的时间是2015.08.17)
这里写图片描述
———————————————————————————
练习:
—想要获取任意一年的2月有多少天;
—思路:2月根据年份是否是闰年会有变化,而3月的天数的固定31天的,因此我们可以设置一个日期3月31日,然后减一天即可,得到改天日期。实例代码:
———————————————————————————

import java.util.*;class Demo15_11{        public static void main(String[] args)        {                System.out.println(getFebDaysByYear(2000));//打印29                System.out.println(getFebDaysByYear(2001));//打印28        }        static int getFebDaysByYear(int year)        {                Calendar c = Calendar.getInstance();                c.set(year,2,1);//记住月份从0开始,这里表示year年3月1日                c.add(Calendar.DAY_OF_MONTH,-1);//year年3月1日,天数减一天                return c.get(Calendar.DAY_OF_MONTH);//返回2月最后一天的日        }}

———————————————————————————
执行结果:
这里写图片描述
———————————————————————————
———————————————————————————
Math
Math:也是工具类,其中也有一堆的静态方法;
这里写图片描述
这里写图片描述
这里写图片描述
ceil方法:
—返回最小的(最接近负无穷大) double 值,该值大于等于参数,并等于某个整数。
—— 返回比参数大或等于参数(当参数是整数的时候)的最小整数;
————————————————————————————————————
floor方法:
—返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。
—— 返回比参数小或等于参数(当参数是整数的时候)的最大整数;
————————————————————————————————————
round方法: 四舍五入
static long round(double a)
返回最接近参数的 long。
static int round(float a)
返回最接近参数的 int。
————————————————————————————————————
pow方法:
—static double pow(double a, double b)
返回第一个参数的第二个参数次幂的值。
————————————————————————————————————
random方法:
—static double random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
——Math.random();随机数;0~1,包含0 不包含1
———第一次调用该方法时,它将创建一个新的尾随数生成器;

只要是有算法算出来的就可以找到规律,这里就是伪随机的解释;
Math.random()*10;
—0~10不包含10,
Math.random()*10+1;
—1~11,不包含11;
(int)(Math.random()*10+1);
—1~10;整数
(int)(Math.random()*6+1);
—举例:筛子
—————————————————————————————
—————————————————————————————
Random
存在于java.util包中。
这里写图片描述

0 0