1:Scanner类
主要作用:
获取输入,Scanner是一个基于正则的文本扫描器;
Scanner有多个构造方法,用于实现从输入流、文件、字符串中解析数据;
Scanner是1.5有了的,1.5之前使用的是BufferedReader
主要方法:
hasNext():是否还有下一项输入;
hasNextXxx():是否有下一个输入项(Xxx->int,long等基本类型的String形式);
nextXxx():获取下一个Xxx类型的数据;
/**默认情况下每一项输入按照空格、tab、回车分割;
demo_1:键盘数据源
1 package scanner;
2 import java.util.Scanner;
3 public class demo_1 {
4 public static void main(String[] args) {
5 Scanner sc = new Scanner(System.in); //指定数据源为:键盘输入
6 sc.useDelimiter("\n"); //指定(Delimiter-定界符)为:回车
7 while(sc.hasNext()){
8 String inStr = sc.next();
9 System.out.println("inStr");
10 }
11 }
12 }
demo_2:文件数据源
1 package scanner;
2 import java.io.File;
3 import java.io.FileNotFoundException;
4 import java.util.Scanner;
5 public class demo_2 {
6 public static void main(String[] args) throws FileNotFoundException {
7 Scanner sc = new Scanner(new File("a.txt")); //指定数据源:文件
8 while(sc.hasNextLine()){ //是否有下一行
9 String inStr = sc.nextLine(); //获取下一行
10 System.out.println("inStr");
11 }
12 }
13 }
System类:
作用:
java 是跨品台语言,在程序中可以使用System类和Runtime类和特定的平台交互;
System类代表当前运行的平台,System提供了不少类属性和类方法。
System类提供了:标准输入、标准输出、错误输出的类属性,提供了用于获取系统属性的类方法,提供了加载文件和动态链接库的方法;
垃圾回收方法gc(),系统当前时间currentTimeMillis()和nanoTime();
获取某个对象的精确哈希值identityHashCode(Object x),这个哈希值是按照类的地址计算出来的。(hashCode()方法可以重写但是这个方法不能)
demo_1:
package scanner;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
public class demo_1 {
public static void main(String[] args) throws FileNotFoundException, IOException{
Map<String,String> env = System.getenv(); //获取系统所有的环境变量
for(String name : env.keySet()){
System.out.println(name+"->"+env.get(name));
}
System.out.println("JAVA_HOME="+System.getenv("JAVA_HOME")); //获取指定环境变量
Properties propts = System.getProperties(); //获取所有的系统属性
propts.store(new FileOutputStream("propts.txt"),"System properties"); //将系统属性输出到文件中
System.out.println(System.getProperty("os.name")); //获取指定系统属性
}
}
demo_2:
package scanner;
public class demo_1 {
public static void main(String[] args){
//String类自定义了hashCode方法为:根据字符序列计算hashCode;(字符串相同hashCode就是相同)
String s1 = new String("hello");
String s2 = new String("hello");
boolean b1 = s1.hashCode() == s2.hashCode(); //返回true
boolean b2 = System.identityHashCode(s1) != System.identityHashCode(s2); //放回true
}
}
Runtime类
Runtime类表示java程序运行吃的环境,每一个java程序都有一个与之对应的Runtime实例通过getRuntime()方法获得;
作用:
1: 获取jvm信息:处理器数量、内存信息等。也提供了垃圾回收、清理系统资源、加载动态链接库。
2: 单独启动一条进程来运行操作系统的命令。
demo_1:
1 package demo;
2 import java.io.IOException;
3 public class Demo {
4 public static void main(String[] args) throws IOException{
5 Runtime runtime = Runtime.getRuntime();
6 System.out.println("处理器数量:"+runtime.availableProcessors());
7 System.out.println("空闲内存:"+runtime.freeMemory());
8 System.out.println("总内存:"+runtime.totalMemory());
9 System.out.println("最大可用内存:"+runtime.maxMemory());
10 //启动一个线程来执行操作系统命令
11 runtime.exec("notepad.exe");
12 }
13 }
BigDecimal类:
java中的long,double类会引起精度的丢失,BigDecimal类解决了这个问题。(其他语言也会出现精度丢失的问题)
例如:0.05 + 0.01 = 0.060000000000000005
BigDecimal类有大量的构造器来方便构造各种类型的大小数。
包括:将各种数字类型->BigDecimal。String类型的数字->BigDecimal
new BigDecimal(Doublce dou)会造成精度流失,推荐使用new BigDecimal(String num)来构造。
如果非要用double可以使用BigDecimal.valueOf(Double dou)方法。
1 package demo;
2 import java.math.BigDecimal;
3 public class Demo {
4 public void mian(String[] args){
5 //String构造
6 BigDecimal b1 = new BigDecimal("0.05");
7 BigDecimal b2 = new BigDecimal("0.01");
8 //加,减,乘,除
9 b1.add(b2); //0.06
10 b1.subtract(b2); //.0.4
11 b1.multiply(b2); //0.0005
12 b1.divide(b2); //5
13 //使用double构造
14 BigDecimal b3 = BigDecimal.valueOf(0.05);
15 BigDecimal b4 = BigDecimal.valueOf(0.01);
16 //加,减,乘,除
17 b3.add(b4); //0.06000000000.......
18 b3.subtract(b4);
19 b3.multiply(b4);
20 b3.divide(b4);
21 //*****以后还是用 new BigDecimal(String str) 吧
22 //#####上面运算结果都是BigDecimao类型的。(double->BigDecimal->double)
23 //double->BigDeciaml new BigDecimal(""+double);
24 //BigDecimal->double bigDecimal.doubleValue();
25 }
26 }
Date类:
Date类的历史悠久,很多方法过时了,不推荐使用。
剩下的几个有用的方法如下:
构造方法:
Date():生成当前时间对应的Date对象。底层调用了System.currentTimeMillis()方法获取的时间long值
Date(Long date):根据时间long值生成Date对象。
普通方法:
Boolean after(Date date)该日期是否在指定日期之后
Boolean before(Date date)改日期是否在指定日期之前
int compareTo(Date date)比较两个日期的大小。返回-1,1
long getTime():返回对应时间的Long值,1970.1.1到现在的毫秒值
void setTime(long time):设置Date对象的时间
Calendar类:
Calendar类是一个抽象类,表示日历,提供了日历相关的公用方法。其子类实现了各种日历(GregorianCalendar类就是我们说的公历,网上也有农历的实现)
getInstance方法:
Calendar抽象类提供了几个getInstance方法,会根据TimeZone,Locale构造Calendar,不指定时按照默认的。
Calendar类和Date类都是日期类型的工具类,他们可以自由的互相转换:
//Calendar -> Date
Calendar calendar = new Calendar.getInstance();
Date date = calendar.getTime();
//Date -> Calendar
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Calendar提供了大量日期访问修改的方法例如:
void add(int field , int amount):根据日期规则给日期加减指定时间。
void roll(int fidld , int amount):和add方法类似,但是这个方法是有上限的。
int get(int field): 获取指定日历字段的值。(获取年,月,日...)
void set(int field , int value):将给定的日历字段设置为指定的值
void set(int year, int month ,int day):设置年月日,还有个重载的方法可以设置年月日时分秒
上面的int类型的参数都是Calendar类定义的Int类型的常量:例如:Calendar.YEAR,Calendar.MONTH等,(注意:Calendar.MONTH是0-11)
add(int faild , int amount)和roll(int faild , int amount)的区别:
add方法就是我们想象中的加日期,减日期,某天(2017-12-25)加10天就是十天后的日期(2018-01-04)。
roll方法则不同,某天(2017-12-25)加10天则不会进位到月,而是将月循环增加(2017-12-04)
Calendar类的容错性:
Calendar类默认提供了比较好的容错性,例如:calendar.set(Calendar.MONTh,13) 月是不存在13的,这会使年加一。
但是在校验严格的情况下不允许这种容错的存在:可以通过Calendar.setLenient(false)方法关掉容错。
set()方法的延迟修改:
set方法修改了某一日历对象的值后,改日历对象不会立即将其代表的时间修改,而是等到下一下调用get,add,等等方法时计算。
package demo;
import java.util.Calendar;
public class Demo {
public void mian(String[] args){
//Calendar类常用方法
Calendar calendar = Calendar.getInstance();
calendar.get(Calendar.YEAR);
calendar.get(Calendar.MONTH);
calendar.get(Calendar.DAY_OF_MONTH);
calendar.add(Calendar.YEAR,1);
calendar.roll(Calendar.YEAR,-8);
//Calendar类容错性:
Calendar calendar1 = Calendar.getInstance();
calendar.set(Calendar.MONTH,12); //不报错:月份超出后进位到年上
calendar.setLenient(false);
calendar.set(Calendar.MONTH,12); //报错:关闭容错后不再进位,超出就报错。
}
}
格式化器:
NumberFormat抽象类:
描述:
NumberFormat类是Format抽象类的子类,其作用是:实现字符串和数值的互相转换。
构造:
通过工厂方法获取NumbeFormat的实例:(这些构造方法可以指定Local,不同地区格式化结果不同)
NumberFormat.getInstance()
NumberFormat.getIntegerInstance()
NumberFormat.getPercentInstance()
NumberFormat.getCurrencyInstance()
方法:
String format(数字类型) 数字类型 --> 字符串
Number parse(String) 字符串 --> 数字类型
DateFormat抽象类:
描述:
DateFormat类也是Format类的子类,其作用是:实现字符串和日期的互相转换
构造:(重载方法的一般形式:DateFormat getXXXInstance(int style) DateFormat getXXXInstance(int style, Locale locale)
格式style Date格式化 Time格式化
// DateFormat.SHORT 07-12-20 上午12:24
// DateFormat.MEDIUM 2017-12-20 0:24:33
// DateFormat.FULL 2017年-12月-20日 上午12时24分33秒
// DateFormat.LONG 2017年-12月-20日 星期三 上午12时24分33秒 SCT
)
//格式化为日期
DateFormat.getDateInstance();
//格式化为时间
DateFormat.getTimeInstance();
//格式化为日期加时间
DateFormat.getDateTimeInstance();
方法:
String format(Date)
Date parse(String)
SimpleDateFormat类:
描述:SimpleDateFormat类比SimpleDateFormat易于使用。
构造:
在创建SimpleDateFormat时需要传入一个pattern的字段,该字段不是需要格式化的字符串的一个日期模板。
格式化器Demo:
1 package com.vtstar.sct.desktop.clients.FeedingLine21.swingUI;
2 import java.text.DateFormat;
3 import java.text.NumberFormat;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7 public class Demo {
8 public static void main(String[] args) throws ParseException {
9 //格式化数字
10 //获取一个普通的数字格式器
11 String numberFormat01 = NumberFormat.getInstance().format(12.345); //12.345
12 //获取一个整数类型的数字格式化器
13 String numberFormat02 = NumberFormat.getIntegerInstance().format(12.345); //12
14 //获取一个百分比格类型的格式化器
15 String numberFormat03 = NumberFormat.getPercentInstance().format(0.345); //34%
16 //获取一个货币类型的格式化器
17 String numberFormat04 = NumberFormat.getCurrencyInstance().format(12.345); //¥12.35
18
19 //格式化为日期
20 String dateShort = DateFormat.getDateInstance(DateFormat.SHORT).format(new Date()); //18-1-10
21 //格式化为时间
22 String dateMedium = DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date()); //2018-1-10
23 //格式化为日期加时间
24 String dateLong = DateFormat.getDateInstance(DateFormat.LONG).format(new Date()); //2018年-1月-10日
25 //日期时间和时间的格式化器
26 DateFormat.getDateTimeInstance();
27 DateFormat.getDateTimeInstance();
28
29 //SimpleDateFormat
30 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
31 Date date = simpleDateFormat.parse("2018-09-22"); //Sat Sep 22 00:00:00 CST 2018
32 String dateStr = simpleDateFormat.format(new Date()); //2018-01-10
33 }
34 }