1.System类
类中的方法和属性都是静态的。
属性:out和in都是不同的对象,可以调用不同的输出输入方法。
常见方法:
1.static long currentTimeMillis()
返回以毫秒为单位的当前时间。
返回:当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
2.static void exit(int status)
终止当前正在运行的 Java 虚拟机。
3.static void gc()
运行垃圾回收器。
4.static Properties getProperties()
确定当前的系统属性。Properties是HashTable的子类,Map集合。没有泛型。
/*
Properties集合中存储的都是String类型的键和值。
最好使用它自己的存储和取出的方法来完成元素的操作。
存:
Object setProperty(String key, String value)
调用 Hashtable 的方法 put。
取:
Set<String> stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
*/
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); //定义成全局常量
public static void demo(){
Properties prop = System.getProperties();
Set<String> nameSet = prop.stringPropertyNames();
for(String name: nameSet){
String value = prop.getProperty(name);
System.out.println(name+":\t\t"+value);
}
System.out.println("hello"+ LINE_SEPARATOR + "world"); //实现任何平台下的换行操作。
System.setProperty("mykey","myvalue"); //给系统设置一些属性信息,这些信息是全局的,其他程序都可以使用。
}
系统属性显示:
java.runtime.name: Java(TM) SE Runtime Environment java运行环境名字
sun.boot.library.path: D:\Java\jdk1.7.0_80\jre\bin java启动目录
java.vm.version: 24.80-b11
java.vm.vendor: Oracle Corporation
java.vendor.url: http://java.oracle.com/
path.separator: ;
java.vm.name: Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg: sun.io
user.script:
user.country: CN 用户的国家
sun.java.launcher: SUN_STANDARD
sun.os.patch.level:
java.vm.specification.name: Java Virtual Machine Specification
user.dir: D:\Workspaces\MyEclipse Professional 2014\day15 当前用户目录
java.runtime.version: 1.7.0_80-b15
java.awt.graphicsenv: sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs: D:\Java\jdk1.7.0_80\jre\lib\endorsed
os.arch: amd64
java.io.tmpdir: C:\Users\ADMINI~1\AppData\Local\Temp\
line.separator: 行分隔符(在 UNIX 系统中是“/n”)
java.vm.specification.vendor: Oracle Corporation
user.variant:
os.name: Windows 8.1 操作系统名称
sun.jnu.encoding: GBK
java.library.path: D:\Java\jdk1.7.0_80\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:\Java\jdk1.7.0_80\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;.
java.specification.name: Java Platform API Specification
java.class.version: 51.0
sun.management.compiler: HotSpot 64-Bit Tiered Compilers
os.version: 6.3
user.home: C:\Users\Administrator
user.timezone:
java.awt.printerjob: sun.awt.windows.WPrinterJob
file.encoding: GBK 文件编码
java.specification.version: 1.7
user.name: 言冘
java.class.path: D:\Workspaces\MyEclipse Professional 2014\day15\bin
java.vm.specification.version: 1.7
sun.arch.data.model: 64
java.home: D:\Java\jdk1.7.0_80\jre
sun.java.command: cn.itcast.toolclass.arrays.demo.Demo
java.specification.vendor: Oracle Corporation
user.language: zh 用户语言
awt.toolkit: sun.awt.windows.WToolkit
java.vm.info: mixed mode
java.version: 1.7.0_80
java.ext.dirs: D:\Java\jdk1.7.0_80\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path: D:\Java\jdk1.7.0_80\jre\lib\resources.jar;D:\Java\jdk1.7.0_80\jre\lib\rt.jar;D:\Java\jdk1.7.0_80\jre\lib\sunrsasign.jar;D:\Java\jdk1.7.0_80\jre\lib\jsse.jar;D:\Java\jdk1.7.0_80\jre\lib\jce.jar;D:\Java\jdk1.7.0_80\jre\lib\charsets.jar;D:\Java\jdk1.7.0_80\jre\lib\jfr.jar;D:\Java\jdk1.7.0_80\jre\classes
java.vendor: Oracle Corporation
file.separator: \
java.vendor.url.bug: http://bugreport.sun.com/bugreport/
sun.cpu.endian: little
sun.io.unicode.encoding: UnicodeLittle
sun.desktop: windows
sun.cpu.isalist: amd64
getProperties 的 API:
getProperties
public static Properties getProperties()
确定当前的系统属性。
首先,如果有安全管理器,则不带参数直接调用其 checkPropertiesAccess 方法。这可能导致一个安全性异常。
将 getProperty(String) 方法使用的当前系统属性集合作为 Properties 对象返回。如果没有当前系统属性集合,则先创建并初始化一个系统属性集合。这个系统属性集合总是包含以下键的值: 键 相关值的描述
java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.home Java 安装目录
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应商
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name Java 虚拟机实现名称
java.specification.version Java 运行时环境规范版本
java.specification.vendor Java 运行时环境规范供应商
java.specification.name Java 运行时环境规范名称
java.class.version Java 类格式版本号
java.class.path Java 类路径
java.library.path 加载库时搜索的路径列表
java.io.tmpdir 默认的临时文件路径
java.compiler 要使用的 JIT 编译器的名称
java.ext.dirs 一个或多个扩展目录的路径
os.name 操作系统的名称
os.arch 操作系统的架构
os.version 操作系统的版本
file.separator 文件分隔符(在 UNIX 系统中是“/”)
path.separator 路径分隔符(在 UNIX 系统中是“:”)
line.separator 行分隔符(在 UNIX 系统中是“/n”)
user.name 用户的账户名称
user.home 用户的主目录
user.dir 用户的当前工作目录
系统属性值中的多个路径是用平台的路径分隔符分隔的。
注意,即使安全管理器不允许执行 getProperties 操作,它可能也会选择允许执行 getProperty(String) 操作。
返回:
系统属性
抛出:
SecurityException - 如果安全管理器存在并且其 checkPropertiesAccess 方法不允许访问系统属性。
2.Runtime类
/*
Runtime:
没有构造方法摘要,说明该类不能创建对象。
而且方法大多都是非静态的,说明该类应该提供静态的方法返回该类对象。
静态方法只有一个,说明Runtime类使用了单例设计模式。
这个静态方法是
static Runtime getRuntime()
返回与当前 Java 应用程序相关的运行时对象。
*/
常用方法:
1.执行:
Process exec(String command)
在单独的进程中执行指定的字符串命令。
①它的返回类型是Process的对象,一个抽象类。
②Runtime.exec 方法是用来创建一个本机进程,Process 子类是用来控制进程并获得相关信息。
Process类控制子进程的常用方法:
1.abstract void destroy()
杀掉子进程。
Runtime r = Runtime.getRuntime(); //通过工厂方法获得Runtime的对象(execute:执行,xxx.exe)
Process p = r.exec("D:\\notepad.exe C:\\time.java"); //执行命令:用一个应用程序解析一个文件
Thread.sleep(5000); //暂停5秒
p.destroy(); //杀死进程
3.Math类:
/*
Math:提供了操作数学运算的方法。都是静态的。
常用的方法:
1.绝对值:double,float,int,long。
static double abs(double a)
返回 double 值的绝对值。
2.取整:
向上取整:double
static double ceil(double a)
返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。
向下取整:double
static double floor(double a)
返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。
四舍五入取整:double,float
static long round(double a)
返回最接近参数的 long。
3.最值:double,float,int,long。
最大:
static double max(double a, double b)
返回两个 double 值中较大的一个。
最小:
static double min(double a, double b)
返回两个 double 值中较小的一个
4.a^b:
static double pow(double a, double b)
返回第一个参数的第二个参数次幂的值。
5.立方:
static double cbrt(double a)
返回 double 值的立方根。
6.伪随机数:
static double random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
Math.ceil(Math.random()*10); //0.0~10.0
Math.floor(Math.random()*10); //0.0~9.0
(int)(Math.random()*10+1); //1~10
(int)(Math.random()*6+1); //1~6
Rundom类:也有伪随机数方法nextDouble()。
Random r= new Random();
int i = (int)(r.nextDouble()*6+1); //1~6
int i = r.nextInt(6)+1; //1~6
其他方法:
int nextInt()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int nextInt(int n) //0~n,不包括n
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
long nextLong()
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
float nextFloat()
返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 float 值。
boolean nextBoolean()
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。
*/
4.Date类: java.util.Date;
构造方法:
Date()
分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
Date(long date)
分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
/*
日期对象和毫秒值之间的转换:
毫秒值-->日期对象:这样可以通过Date对象的方法对该日期中的各个字段(年月日等)进行操作。
1.通过Date对象的构造方法 new Date(timeMillis);
2.通过setTime设置:
void setTime(long time)
设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。
日期对象-->毫秒值:这样可以通过具体的数值进行运算。
1. getTime设置:
long getTime()
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
*/
public static void main(String[] args) {
long time = System.currentTimeMillis(); //1509105754163
// System.out.println(time);
Date date1 = new Date(1509105754163l); //将指定毫秒值封装成Date对象。
System.out.println(date1); //Fri Oct 27 20:02:34 CST 2017
Date date2 = new Date(); //将当前日期和时间封装成Date对象。
System.out.println(date2); //Fri Oct 27 20:04:22 CST 2017
}
1.日期比较:
boolean after(Date when)
测试此日期是否在指定日期之后。
boolean before(Date when)
测试此日期是否在指定日期之前。
boolean equals(Object obj)
比较两个日期的相等性。
使用这一个方法就可以实现上面所有方法:
int compareTo(Date anotherDate) //一般用于排序
比较两个日期的顺序。
日期对象 转换成 日期格式字符串:
1.Date类 API中相关解释:
从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间获取,设置,偏移等操作,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。
2.DateFormat 类:java.text.Format.DateFormat,抽象类,提供了静态工厂方法获得对象。
DateFormat类 API中相关解释:
①日期格式器getDateInstance():
要格式化一个当前语言环境下的日期,可使用某个静态工厂方法:
myString = DateFormat.getDateInstance().format(myDate);
要格式化不同语言环境的日期,可在 getDateInstance() 的调用中指定它。
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
如果格式化多个日期,那么获取该格式并多次使用它是更为高效的做法,这样系统就不必多次获取有关环境语言和国家/地区约定的信息了。
DateFormat df = DateFormat.getDateInstance();
for (int i = 0; i < myDate.length; ++i) {
output.println(df.format(myDate[i]) + "; ");
}
还可使用 DateFormat 进行解析。
myDate = df.parse(myString);
另外:还提供了一些其他静态工厂方法:
②时间格式器:使用 getTimeInstance 可获取该国家/地区的时间格式。
static DateFormat getTimeInstance()
获取时间格式器,该格式器具有默认语言环境的默认格式化风格。
static DateFormat getTimeInstance(int style)
获取时间格式器,该格式器具有默认语言环境的给定格式化风格。
static DateFormat getTimeInstance(int style, Locale aLocale)
获取时间格式器,该格式器具有给定语言环境的给定格式化风格。
③日期/时间格式器:使用 getDateTimeInstance 可获取日期和时间格式。
static DateFormat getDateTimeInstance()
获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格。
static DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
获取日期/时间格式器,该格式器具有默认语言环境的给定日期和时间格式化风格。
static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)
获取日期/时间格式器,该格式器具有给定语言环境的给定格式化风格。
参数:
dateStyle - 给定的日期格式化风格。
timeStyle - 给定的时间格式化风格。
aLocale - 给定的语言环境。
可以将不同选项传入这些工厂方法,以控制结果的长度(从 SHORT 到 MEDIUM 到 LONG 再到 FULL)。确切的结果取决于语言环境,但是通常:
SHORT 完全为数字,如 12.13.52 或 3:30pm
MEDIUM 较长,如 Jan 12, 1952
LONG 更长,如 January 12, 1952 或 3:30:32pm
FULL 是完全指定,如 Tuesday、April 12、1952 AD 或 3:30:42pm PST。
getDateInstance API:
public static final DateFormat getDateInstance()
获取日期格式器,该格式器具有默认语言环境的默认格式化风格。
public static final DateFormat getDateInstance(int style)
获取日期格式器,该格式器具有默认语言环境的给定格式化风格。
public static final DateFormat getDateInstance(int style,Locale aLocale)
获取日期格式器,该格式器具有给定语言环境的给定格式化风格。
参数:
style - 给定的格式化风格。例如,SHORT 用于 US 语言环境中的 "M/d/yy"。
aLocale - 给定的语言环境。
format方法:
public final String format(Date date)将一个 Date 格式化为日期/时间字符串。
例子:
/*
对日期对象进行格式化。
*/
public static void main(String[] args) {
Date date =new Date();
//获取日期格式器。具有默认语言环境的指定格式化风格。
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
//获取时间格式器。具有默认语言环境的指定格式化风格。
DateFormat dateFormat1 = DateFormat.getTimeInstance(DateFormat.FULL);
//获取日期/时间格式器。具有默认语言环境的指定格式化风格。
DateFormat dateFormat2= DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
//通过格式器调用格式化Date对象的方法进行格式化
String str = dateFormat.format(date);
String str1 = dateFormat1.format(date);
String str2 = dateFormat2.format(date);
System.out.println("日期格式化:\t"+str);
System.out.println("时间格式化:\t"+str1);
System.out.println("日期/时间格式化:\t"+str2);
}
显示:
日期格式化: 2017年10月27日 星期五
时间格式化: 下午09时11分23秒 CST
日期/时间格式化: 2017年10月27日 下午09时11分23秒
日期对象 转换成 自定义格式字符串:
SimpleDateFormat类:DataFormate的子类。
构造方法:
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy--MM--dd");
String str = dateFormat.format(date);
System.out.println(str);
附:
字母 日期或时间元素 表示 示例
G Era标志符 Text AD
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
示例:
日期和时间模式 结果
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
日期格式字符串 转换成 日期对象:
DateFormat的parse方法:
Date parse(String source)
从给定字符串的开始解析文本,以生成一个日期。
例子:
// String str = "2012-4-19";
// DateFormat dateFormat = DateFormat.getDateInstance();
// String str = "2012年4月19日";
// DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
String str = "2012---4---19";
DateFormat dateFormat = new SimpleDateFormat("yyyy---MM---dd");
Date date = dateFormat.parse(str);
System.out.println(date);
Date类练习:
/*
练习:
"2012-3-13"到"2012-4-6"中间有多少天?
思路:
两个日期相减。
必须有两个减法运算的数。
能减的可以是毫秒值。
通过date对象。
将字符串转成date对象。
1.将日期格式的字符串转成date对象。
2.将date对象转成毫秒值。
3.相减,变成天数。
*/
public static void main(String[] args) throws ParseException {
String str1 = "2017-10-27";
String str2 = "2017-12-26";
int timeDay = method(str1,str2);
System.out.println(timeDay);
}
private static int method(String str1, String str2) throws ParseException {
DateFormat dateFormat = DateFormat.getDateInstance();
Date date1 = dateFormat.parse(str1);
Date date2 = dateFormat.parse(str2);
int timeDay = (int)(Math.abs(date2.getTime()-date1.getTime())/1000/60/60/24);
return timeDay;
}
3.Calendar 日历类: java.util.Calendar, 抽象类 。
Date API: 从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段的获取,设置,偏移等操作。
静态工厂方法:
static Calendar getInstance()
使用默认时区和语言环境获得一个日历。
static Calendar getInstance(Locale aLocale)
使用默认时区和指定语言环境获得一个日历。
static Calendar getInstance(TimeZone zone)
使用指定时区和默认语言环境获得一个日历。
static Calendar getInstance(TimeZone zone, Locale aLocale)
使用指定时区和语言环境获得一个日历。
Calendar c = Calendar.getInstance();
System.out.println(c);
输出:
java.util.GregorianCalendar[
time=1509114443842,
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=2017,
MONTH=9,
WEEK_OF_YEAR=43,
WEEK_OF_MONTH=4,D
AY_OF_MONTH=27,
DAY_OF_YEAR=300,
DAY_OF_WEEK=6,
DAY_OF_WEEK_IN_MONTH=4,
AM_PM=1,
HOUR=10,
HOUR_OF_DAY=22,
MINUTE=27,
SECOND=23,
MILLISECOND=842,Z
ONE_OFFSET=28800000,
DST_OFFSET=0
]
通过字段获取值的方法:
public int get(int field)
返回给定日历字段的值。
System.out.println(c.get(Calendar.YEAR)); //2017
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); //2017年10月27日 星期五
public static String getWeek(int i){
String[] week= {"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
return week[i-1];
}
Calendar日历类练习:
//设置日期:
void set(int field, int value)
将给定的日历字段设置为给定值。
void set(int year, int month, int date)
设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute)
设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)
设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
Calendar c = Calendar.getInstance();
c.set(2011,3,20);
//日期的偏移:
abstract void add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。
c.add(Calendar.YEAR,-2);
c.add(Calendar.DAY_OF_MONTH,12); //记住时间是连续性的
//Calendar类转换成Date对象: 从而使用Date的格式化输出。
Date getTime()
返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
/*
任何一年中的2月有多少天?
*/
public static void main(String[] args) {
int year = 2017;
showDays(year);
}
private static void showDay(int year) {
Calendar c = Calendar.getInstance();
c.set(year, 2, 1);
c.add(Calendar.DAY_OF_MONTH, -1);
System.out.println(c.get(Calendar.DAY_OF_MONTH));
}
/*
输出昨天的现在的这个时刻。
*/
public static void main(String[] args) {
showLastDay();
}
private static void showLastDays() {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -1);
DateFormat dateFormat = DateFormat.getTimeInstance();
System.out.println(c.get(Calendar.YEAR)+"-"+(c.get(Calendar.MONTH)+1)+"-"+c.get(Calendar.DAY_OF_MONTH)+ " " +dateFormat.format(c.getTime()));
//2017-10-26 23:28:48
}