第二十九講 常用類
System
概述
System類用於描述系統一些資訊,該類中的方法和屬性都是靜態的。其中有兩個最常見的屬性,分別是:
- out:標準輸出流,預設對應的裝置是顯示器;
- in:標準輸入流,預設對應的裝置是鍵盤。
最常見的成員方法
方法 | 說明 |
---|---|
public static long currentTimeMillis() | 返回以毫秒為單位的當前時間 |
public static Properties getProperties() | 獲取當前的系統屬性資訊 |
public static String getProperty(String key) | 獲取指定鍵指示的系統屬性 |
System類的currentTimeMillis()方法可統計一段程式的執行時間,例如:
package cn.liayun.otherapi;
public class SystemDemo {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
System.out.println("hello" + i);
}
long end = System.currentTimeMillis();
System.out.println("共耗時:" + (end - start) + "毫秒");
}
}
System類的getProperties()方法將獲取到的系統資訊都儲存到了Properties鍵值集合中,又因為Properties是HashTable的子類,也就是Map集合的一個子類物件,所以可以通過Map的方法取出該集合的元素。該集合中儲存的都是字串,沒有泛型定義。以下程式碼用於獲取系統屬性資訊:
Properties prop = System.getProperties(); // 獲取到的系統資訊都儲存到了Properties鍵值集合當中了。
- 獲取所有屬性資訊
Set<String> keySet = prop.stringPropertyNames(); for (String key : keySet) { String value = prop.getProperty(key); System.out.println(key + "::" + value); }
- 獲取指定屬性資訊
String value = System.getProperty("os.name"); System.out.println("value="+value);
Runtime
概述
每個Java應用程式都有一個Runtime類例項,使應用程式能夠與其執行的環境相連線。可以通過 getRuntime方法獲取當前執行時。應用程式不能建立自己的Runtime類例項。
最常見的成員方法
方法 | 說明 |
---|---|
public static Runtime getRuntime() | 返回與當前Java應用程式相關的執行時物件 |
public Process exec(String command) | 在單獨的程序中執行指定的字串命令 |
Runtime類並沒有提供建構函式,說明不可以new物件,那麼我們會直接想到該類中的方法都是靜態的,但發現該類中還有非靜態方法,說明該類肯定會提供方法獲取本類物件,而且該方法是靜態的,返回值型別是本類型別。查閱API,可知該方法是public static Runtime getRuntime(),由這個特點可以看出該類使用了單例設計模式。
package cn.liayun.otherapi;
import java.io.IOException;
public class RuntimeDemo {
public static void main(String[] args) throws IOException {
/*
* 單例模式的物件Runtime。
*/
Runtime r = Runtime.getRuntime();
// r.exec("notepad.exe");
r.exec("notepad.exe D:\\Practise\\Java Base\\JavaSE_Code\\lee_day19\\SysInfo.txt");
}
}
Math
概述
Math類包含用於執行基本數學運算的方法,如初等指數、對數、平方根和三角函式。
最常見的成員方法
方法 | 說明 |
---|---|
public static int abs(int a) | 返回int值的絕對值 |
public static double ceil(double a) | 返回大於指定資料的最小整數 |
public static double floor(double a) | 返回小於指定資料的最大整數 |
public static long round(double a) | 四捨五入 |
public static double pow(double a,double b) | a的b次冪 |
public static double random() | 返回帶正號的double值,該值大於等於0.0且小於1.0 |
package cn.liayun.otherapi;
import java.util.Random;
public class MathDemo {
public static void main(String[] args) {
/*
* Math:數學類,都是靜態的成員。
*/
double d1 = Math.ceil(12.34);
double d2 = Math.floor(12.34);
double d3 = Math.round(12.34);//四捨五入。
System.out.println("d1 = " + d1);//13
System.out.println("d2 = " + d2);//12
System.out.println("d3 = " + d3);//12
System.out.println(Math.pow(10, 3));
for (int x = 0; x < 10; x++) {
int d = (int) Math.ceil(Math.random() * 6);
System.out.println(d);
}
}
}
練習
給定一個小數,保留該小數的後兩位。
package cn.liayun.otherapi;
import java.text.DecimalFormat;
public class Test {
public static void main(String[] args) {
String str_num = getNumber(0.9);
System.out.println(str_num);
}
private static String getNumber(double d) {
DecimalFormat decimalFormat = new DecimalFormat("#0.00");//模式不能寫成"#.00"
return decimalFormat.format(d);
}
}
Random
概述
此類用於產生偽隨機數,如果用相同的種子建立兩個Random例項,則對每個例項進行相同的方法呼叫序列,它們將生成並返回相同的數字序列。
最常見的成員方法
方法 | 說明 |
---|---|
public int nextInt() | 返回的是int範圍內的隨機數 |
public int nextInt(int n) | 返回的是[0,n)範圍內的隨機數 |
例,產生10個1~6(包括1,但不包括6)圍內的偽隨機數。
package cn.liayun.otherapi;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random r = new Random();
for (int i = 0; i < 10; i++) {
int num = r.nextInt(6) + 1;
System.out.println(num);
}
}
}
Date
格式化和解析日期字串
日期物件的格式化
首先建立Date物件,並列印。
Date d = new Date();
System.out.println(d); // 列印的時間看不懂,希望有些格式。
這時可發現列印的時間看不懂,想要把日期按照我們的習慣格式化一下,咋辦呢?可將模式封裝到SimpleDateFormat物件中,如下:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
然後呼叫format()方法讓模式格式化指定的Date物件,將日期物件轉成日期格式的字串。
String str_date = dateFormat.format(date);
System.out.println(str_date);
日期字串的解析
將日期格式的字串轉成日期物件,即解析。
package cn.liayun.otherapi;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
public class DateDemo2 {
public static void main(String[] args) throws ParseException {
/*
* "日期格式的字串:2013-07-17"
* 需要將日期格式的字串轉成日期物件,即解析。
*/
String str_date = "2013-07-17";
DateFormat dateFormat = DateFormat.getDateInstance();
Date date = dateFormat.parse(str_date);
System.out.println(date);
}
}
日期物件和毫秒值之間的相互轉換
毫秒值轉成日期物件
毫秒值轉成日期物件,需要呼叫Date類的建構函式或者setTime()方法。
package cn.liayun.otherapi;
import java.text.DateFormat;
import java.util.Date;
public class DateDemo3 {
public static void main(String[] args) {
long time = 1541179812628l;
//毫秒值--->日期物件,建構函式或者setTime()方法。
Date date = new Date(time);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
String str_date = dateFormat.format(date);
System.out.println(str_date);
}
}
日期物件轉成毫秒值
日期物件轉成毫秒值,需要呼叫Date類的getTime()方法。
package cn.liayun.otherapi;
import java.text.DateFormat;
import java.util.Date;
public class DateDemo3 {
public static void main(String[] args) {
long time = 1541179812628l;
//毫秒值--->日期物件,建構函式或者setTime()方法。
Date date = new Date(time);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
String str_date = dateFormat.format(date);
System.out.println(str_date);
//日期物件--->毫秒值,Date物件的getTime()方法。
long time2 = date.getTime();
System.out.println(time2);
}
}
Calendar
概述
Calendar類是一個抽象類,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH、HOUR等 日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。
最常見的成員方法
方法 | 說明 |
---|---|
public static Calendar getInstance() | 獲取例項 |
public int get(int field) | 返回給定日曆欄位的值。日曆類中的每個日曆欄位都是靜態的成員變數,並且是int型別 |
public abstract void add(int field, int amount) | 根據日曆的規則,為給定的日曆欄位新增或減去指定的時間量 |
public final void set(int year, int month, int date) | 設定當前日曆的年月日 |
package cn.liayun.otherapi;
import java.util.Calendar;
import cn.liayun.exception.NotWeekException;
public class CalendarDemo {
public static void main(String[] args) {
/*
* 演示日曆。
* Calendar
*/
Calendar c = Calendar.getInstance();
//對日曆物件進行其中日期的定義。
// c.set(Calendar.YEAR, 2014);
// c.set(2012, 4, 1);
//日期的偏移。
// c.add(Calendar.MONTH, 5);
//獲取其中的所需日期。
showDate(c);
}
private static void showDate(Calendar c) {
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int day = c.get(Calendar.DAY_OF_MONTH);
String week = getWeek(c.get(Calendar.DAY_OF_WEEK));
System.out.println(year + "年" + month + "月" + day + "日" + week);
}
private static String getWeek(int i) {
if (i > 7 || i <= 0) {
throw new NotWeekException("沒有對應的星期,必須是1~7");
}
String[] weeks = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
return weeks[i];
}
}
cn.liayun.exception包中的NotWeekException異常類繼承自RuntimeException類,並顯示呼叫其中所有的構造方法。
package cn.liayun.exception;
public class NotWeekException extends RuntimeException {
public NotWeekException() {
super();
// TODO Auto-generated constructor stub
}
public NotWeekException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
public NotWeekException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public NotWeekException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public NotWeekException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
}
練習
練習一、獲取任意一年的二月有多少天。
思路:
- 根據指定年設定一個時間就是c.set(year, 2, 1),某一年的3月1日;
- c.add(Calendar.DAY_OF_MONTH, -1),3月1日往前推一天,就是2月最後一天。
package cn.liayun.otherapi;
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
//任意一年二月有多少天?三月一日的前一天就是。
int year = 2018;
c.set(year, 2, 1);
c.add(Calendar.DAY_OF_MONTH, -1);
//獲取其中的所需日期。
System.out.println(c.get(Calendar.DAY_OF_MONTH));
}
}
練習二、“2012/3/17”、"2012-5-28"這兩個字串代表的日期之間間隔多少天?
package cn.liayun.test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) throws ParseException {
getDays();
}
//"2012/3/17","2012-5-28",問,間隔多少天?
/*
* 1. 只有毫秒值可以相減。
* 2. 獲取毫秒值,字串--->日期物件--->毫秒值
*/
public static void getDays() throws ParseException {
String str_date1 = "2012/5/17";
String str_date2 = "2012-5-18";
//如何將日期格式字串解析成日期物件呢?
//1.自定義yyyy/MM/dd風格物件。
DateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd");
//2.定義一個預設的風格。
DateFormat dateFormat2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
//3.對日期格式字串進行解析。
Date date1 = dateFormat1.parse(str_date1);
Date date2 = dateFormat2.parse(str_date2);
// System.out.println(date1);
// System.out.println(date2);
//4.通過日期物件獲取毫秒值。
long time1 = date1.getTime();
long time2 = date2.getTime();
//5.相減。
long time = Math.abs(time1 - time2);
int day = transDay(time);
System.out.println(day);
}
private static int transDay(long time) {
return (int)(time / 1000 / 60 / 60 / 24);
}
}