---------------------------android培训、java培训、期待与您交流!---- -------------------------
获取键盘输入
可以从文件,输入流,字符串中解析出基本类型值和字符串值。
提供了多个构造器,不同的构造器可以接受文件,输入流,字符串作为数据源
主要提供2个方法来扫描输入:
hasNextXxx() : 是否还有下一个输入项,
Xxx可以使Int,Long,,, 如果是下一个字符串,可以省略Xxx
nextXxx() : 获取下一个输入项。
默认使用 空白(包括空格,Tab,回车)作为多个输入项之间的分隔符
useDelimiter("\n"); //将回车键作为多个项之间的分隔符
Scanner的读取操作可能被阻塞来等待信息的输入。
两个简单的方法来逐行读取:
boolean hasNextLine();
String nextLine();
Scanner也可以获取任何基本类型的输入项
boolean hasNextLong();
long nextLong();
.....
Scanner 还可以读取文件的输入。
只要在创建Scanner对象时,传入一个File对象作为参数,就可以让Scanner读取文件中的内容。
在JDK1.5之前,程序通常使用BufferedReader 类来获取键盘的输入
创建 用于获取键盘输入的BufferedReader对象:
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
然后调用对象的readLine()方法来逐行读取键盘的输入;阻塞式方法等待键盘的输入
BufferedReader 不能读取基本的类型输入项,
用户的键盘输入都被BufferedReader当成String对象,只能读取String对象。
静态属性
in
out
error
静态方法:用于改变系统的标准输入,输出和错误流。
setIn()
setOut()
setErr()
还有一些静态方法用于访问环境变量,系统属性的方法
几个方法 :
getenv()
getProperties()
getProperty()
还提供了加载文件和动态链接库的方法。
还提供了通知系统进行垃圾回收的
gc()
和通知系统进行资源清理的
runFinalization()
还有2个获取系统当前时间的方法
long currentTimeMillis()
long nanoTime()
返回当前时间与UTC 1970年1月1日午夜的时间差,前者毫秒单位,后者微秒单位。看系统支持度
还有一个方法,可以返回指定的对象的精确hasCode值
identityHashCode(Object x)
应用程序通过该对象与其运行时环境相连。
1.不能创建Runtime实例,
2.通过 Runtime.getRuntime() 方法取得程序关联的Runtime对象。
3.提供 gc() -|
runFinalization() -|通知系统进行垃圾回收,清理系统资源
load(String fileanme) -|
loadLibrary(String libname) -|加载文件和动态链接库。
4.代表Java程序的运行时环境,可以访问JVM的相关信息,
availableProcessors() 处理器数量
freeMemory() 空闲内存数
totalMemory() 总内存数
maxMemory() 可用最大内存数
5.Runtime还有一个功能:可以直接单独启动一条进程来进行操作系统的命令
exec("notepad.exe");
boolean equals(Object obj)
protected void finalize()
Class<?> getClass() :返回该对象的运行时类
int hashCode()
String toString() :返回“运行时类名@十六进制hashCode值”
wait()
notify()
notifyAll() :用于控制线程的暂停和运行
StringBuffer :字符序列可变的字符串,线程安全,
StringBuilder :字符序列可变的字符串,线程不安全,性能略高
1.String
String(byte[] bytes, Charset charset) :使用指定的字符集将指定的byte数组解码成一个新的String对象。
String(byte[] bytes, String charsetName):使用指定的字符集将指定的byte数组解码成一个新的String对象。
String(StringBuffer buffer)
String(StringBuilder builder)
char charAt(int index)
int compareTo(String anotherString) :拿当前的String对象与antherString比较
boolean contentEquals(StringBuffer sb) :将该String对象与StringBuffer对象sb进行比较
当他们包含的字符序列相同时返回true
boolean equalsIgnoreCase(String str) :忽略大小写的字符串比较。
int indexOf(String str) :找出str子字符串在该字符串中第一次出现的位置
int lastIndexOf(String str) :str子字符串在该字符串中最后一次出现的位置
char[] toCharArray() :将字符串转换成char数组
String toLowerCase()
String toUpperCase()
static String valueOf(X x) :一系列用于将基本类型转化成String对象的方法
toRadians() //将角度转换成弧度
acos() //反余弦
asin() //反正弦 -pi/2 到 pi/2间
atan() //反正切 -pi/2 到 pi/2间
cos() //三角余弦
sin() //三角正弦
cosh() //双曲余弦
sinh() //双曲正弦
tan() //正切
atan() //余切
tanh() //
atan2(double y, double x) //将矩形坐标(x, y) 转换成极坐标(r, thet);返回所得角度 theta.
floor() //取整,返回小于目标数的最大整数
ceil() //取整,返回大于目标数的最小整数
round() //取整,四舍五入
squrt() //平方根
cbrt() //立方根
exp() //返回欧拉数e的n次幂
pow() //乘方
log() //自然对数
log10() //底数为10的对数
loglp() //回参数与1之和的自然对数
abs() //绝对值
nextBoolean()
nextDouble()
nextGaussian()
nextInt()
nextLong()
1.为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间来作为Random对象的种子
Random rand = new Random(System.currentTimeMillis());
为了避免精度丢失:
1.优先使用基于String 的构造器,因为其他的构造器产生的浮点数的值是不可预知的,唯有此:
new BigDecimal("0.1")
2.如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数来
创建BigDecimal对象,而应该使用
BigDecimal.valueOf(double value)
BigDecimal类提供了add, substract, multiply, divide, pow等函数进行计算。
的静态方法创建。
需要先将double类型数值包装成BigDecimal对象,然后调用BigDecimal对象的方法执行运算后再将结果转换成double
型变量,可以以BigDecimal为基础定义一个Arith工具类:
Data(); //生成一个代表当前日期时间的Data对象。
//底层调用 System.currentTimeMillis()获得long整数作为日期参数。
Data(long date); //根据指定的long型整数来生成一个Data对象。
方法:
boolean after(Data when); //测定该日期是否在指定日期when之后
boolean before(Data when) //..............................前
int compareTo(Data anotherDate);//比较两个日期的大小,后面的时间大于前面时间。
boolean equals(Object obj); //
long getTime(); //
void setTime(long time); //设置Date对象的时间。
Calendar calendar = Calendar.getInstance(); //构造Calendar类
2.子类GregorianCalendar类表示公元纪年
4.Calendar与Date都是表示日期的工具类,可以直接自由转换
Date date = calendar.getTime(); //从Calendar对象中取出Date对象
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date); //只有通过setTime(Date)方法来转换成Calendar
4.静态属性:
Calendar.YEAR,MONTH,DATE,HOUR,MINITE,SECOND,SUNDAY,..., JANUARY,....,
//月份的起始值是0而不是1
5.常用方法
void add(int field, int amount); //为给定日历字段添加或者减去指定的时间量
void roll(int field, int amount); //类似于add方法,区别在于超出最大范围时,不会向上字段进位
int get(int field); //field表示Calendar静态属性
int getActualMaximum(int field); //返回指定日历字段可能拥有的最大值
int getActualMinimum(int field); //..........................最小值
void set(int field, int value); //将给定的日历字段设置为给定值
void set(int year, int month, int date) //设置Calendar对象年,月,日三个字段
void set(int,int,int,int,int,int) //设置年,月,日,时,分,秒
6.设置Calendar容错性
默认Calendar有容错性,当使用set()方法改变指定字段的值时,如果输入了不合法的参数,自动进位或者退位。
方法:
Calendar.setLenient(false); //关闭容错功能,进行参数检查
7.set()方法的延迟修改
set(f, value)方法将日历字段f更改为value;
尽管日历字段f是立即更改的,但是该Calendar所代表的时间却不会立即修改
知道下一次调用get(),getTime(),getTimeInMillis(),add()或者roll()时才会重新计算日历的时间。
好处是可以避免多次调用set()不会触发多次不必要的计算。
public static TimeZone getDefault() //获得运行机器上的默认时区。
public staitc TimeZone getTimeZone(int id) //根据时区ID来获取时区
2.一些方法
static String[] getAvailableDs() //获取Java支持的所有的时区ID
static TimeZone getDefault() //
String getDisplayName() //获取当前TimeZone对象的时区名称
String getID() //获取时区的ID
static TimeZone getTimeZone(String ID); //
2.Java提供了 Pattern 和 Matcher 两个类用于提供正则表达式支持。
3.String类中提供了几个特殊的方法:
boolean matches(String regex) //判断是否匹配指定正则表达式
String replaceAll(String regex, String replacement)
//返回匹配regex正则表达式的子串替换成replacement后的新字符串
String replaceFirst(String regex, String replacement)
//........................第一个子串替换成replacement后的新字符串
String[] split(String regex)
//根据给定的正则表达式拆分该字符串后得到的字符串数组
获取键盘输入
使用Scanner类
Scanner 基于正则表达式的文本扫描器可以从文件,输入流,字符串中解析出基本类型值和字符串值。
提供了多个构造器,不同的构造器可以接受文件,输入流,字符串作为数据源
主要提供2个方法来扫描输入:
hasNextXxx() : 是否还有下一个输入项,
Xxx可以使Int,Long,,, 如果是下一个字符串,可以省略Xxx
nextXxx() : 获取下一个输入项。
默认使用 空白(包括空格,Tab,回车)作为多个输入项之间的分隔符
useDelimiter("\n"); //将回车键作为多个项之间的分隔符
Scanner的读取操作可能被阻塞来等待信息的输入。
两个简单的方法来逐行读取:
boolean hasNextLine();
String nextLine();
Scanner也可以获取任何基本类型的输入项
boolean hasNextLong();
long nextLong();
.....
Scanner 还可以读取文件的输入。
只要在创建Scanner对象时,传入一个File对象作为参数,就可以让Scanner读取文件中的内容。
使用BufferedReader 获取键盘输入
在JDK1.5之前,程序通常使用BufferedReader 类来获取键盘的输入
创建 用于获取键盘输入的BufferedReader对象:
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
然后调用对象的readLine()方法来逐行读取键盘的输入;阻塞式方法等待键盘的输入
BufferedReader 不能读取基本的类型输入项,
用户的键盘输入都被BufferedReader当成String对象,只能读取String对象。
系统相关
System类
提供了代表标准输入,标准输出和错误输出的类属性;静态属性
in
out
error
静态方法:用于改变系统的标准输入,输出和错误流。
setIn()
setOut()
setErr()
还有一些静态方法用于访问环境变量,系统属性的方法
几个方法 :
getenv()
getProperties()
getProperty()
还提供了加载文件和动态链接库的方法。
还提供了通知系统进行垃圾回收的
gc()
和通知系统进行资源清理的
runFinalization()
还有2个获取系统当前时间的方法
long currentTimeMillis()
long nanoTime()
返回当前时间与UTC 1970年1月1日午夜的时间差,前者毫秒单位,后者微秒单位。看系统支持度
还有一个方法,可以返回指定的对象的精确hasCode值
identityHashCode(Object x)
Runtime
每个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。
1.不能创建Runtime实例,
2.通过 Runtime.getRuntime() 方法取得程序关联的Runtime对象。
3.提供 gc() -|
runFinalization() -|通知系统进行垃圾回收,清理系统资源
load(String fileanme) -|
loadLibrary(String libname) -|加载文件和动态链接库。
4.代表Java程序的运行时环境,可以访问JVM的相关信息,
availableProcessors() 处理器数量
freeMemory() 空闲内存数
totalMemory() 总内存数
maxMemory() 可用最大内存数
5.Runtime还有一个功能:可以直接单独启动一条进程来进行操作系统的命令
exec("notepad.exe");
常用类
Object
是所有类,数组,枚举类的父类boolean equals(Object obj)
protected void finalize()
Class<?> getClass() :返回该对象的运行时类
int hashCode()
String toString() :返回“运行时类名@十六进制hashCode值”
wait()
notify()
notifyAll() :用于控制线程的暂停和运行
String, StringBuffer, StringBuilder
String :不可变类StringBuffer :字符序列可变的字符串,线程安全,
StringBuilder :字符序列可变的字符串,线程不安全,性能略高
1.String
String(byte[] bytes, Charset charset) :使用指定的字符集将指定的byte数组解码成一个新的String对象。
String(byte[] bytes, String charsetName):使用指定的字符集将指定的byte数组解码成一个新的String对象。
String(StringBuffer buffer)
String(StringBuilder builder)
char charAt(int index)
int compareTo(String anotherString) :拿当前的String对象与antherString比较
boolean contentEquals(StringBuffer sb) :将该String对象与StringBuffer对象sb进行比较
当他们包含的字符序列相同时返回true
boolean equalsIgnoreCase(String str) :忽略大小写的字符串比较。
int indexOf(String str) :找出str子字符串在该字符串中第一次出现的位置
int lastIndexOf(String str) :str子字符串在该字符串中最后一次出现的位置
char[] toCharArray() :将字符串转换成char数组
String toLowerCase()
String toUpperCase()
static String valueOf(X x) :一系列用于将基本类型转化成String对象的方法
Math类
toDegrees() //将弧度转换角度toRadians() //将角度转换成弧度
acos() //反余弦
asin() //反正弦 -pi/2 到 pi/2间
atan() //反正切 -pi/2 到 pi/2间
cos() //三角余弦
sin() //三角正弦
cosh() //双曲余弦
sinh() //双曲正弦
tan() //正切
atan() //余切
tanh() //
atan2(double y, double x) //将矩形坐标(x, y) 转换成极坐标(r, thet);返回所得角度 theta.
floor() //取整,返回小于目标数的最大整数
ceil() //取整,返回大于目标数的最小整数
round() //取整,四舍五入
squrt() //平方根
cbrt() //立方根
exp() //返回欧拉数e的n次幂
pow() //乘方
log() //自然对数
log10() //底数为10的对数
loglp() //回参数与1之和的自然对数
abs() //绝对值
Random类
不同于Math类的random()方法,Random类提供了更多方法来生成各种伪随机数,nextBoolean()
nextDouble()
nextGaussian()
nextInt()
nextLong()
1.为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间来作为Random对象的种子
Random rand = new Random(System.currentTimeMillis());
BigDecimal类
位于 java.math包中为了避免精度丢失:
1.优先使用基于String 的构造器,因为其他的构造器产生的浮点数的值是不可预知的,唯有此:
new BigDecimal("0.1")
2.如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数来
创建BigDecimal对象,而应该使用
BigDecimal.valueOf(double value)
BigDecimal类提供了add, substract, multiply, divide, pow等函数进行计算。
的静态方法创建。
需要先将double类型数值包装成BigDecimal对象,然后调用BigDecimal对象的方法执行运算后再将结果转换成double
型变量,可以以BigDecimal为基础定义一个Arith工具类:
Data类
构造器:Data(); //生成一个代表当前日期时间的Data对象。
//底层调用 System.currentTimeMillis()获得long整数作为日期参数。
Data(long date); //根据指定的long型整数来生成一个Data对象。
方法:
boolean after(Data when); //测定该日期是否在指定日期when之后
boolean before(Data when) //..............................前
int compareTo(Data anotherDate);//比较两个日期的大小,后面的时间大于前面时间。
boolean equals(Object obj); //
long getTime(); //
void setTime(long time); //设置Date对象的时间。
Calendar类
1.抽象类,使用Calendar calendar = Calendar.getInstance(); //构造Calendar类
2.子类GregorianCalendar类表示公元纪年
4.Calendar与Date都是表示日期的工具类,可以直接自由转换
Date date = calendar.getTime(); //从Calendar对象中取出Date对象
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date); //只有通过setTime(Date)方法来转换成Calendar
4.静态属性:
Calendar.YEAR,MONTH,DATE,HOUR,MINITE,SECOND,SUNDAY,..., JANUARY,....,
//月份的起始值是0而不是1
5.常用方法
void add(int field, int amount); //为给定日历字段添加或者减去指定的时间量
void roll(int field, int amount); //类似于add方法,区别在于超出最大范围时,不会向上字段进位
int get(int field); //field表示Calendar静态属性
int getActualMaximum(int field); //返回指定日历字段可能拥有的最大值
int getActualMinimum(int field); //..........................最小值
void set(int field, int value); //将给定的日历字段设置为给定值
void set(int year, int month, int date) //设置Calendar对象年,月,日三个字段
void set(int,int,int,int,int,int) //设置年,月,日,时,分,秒
6.设置Calendar容错性
默认Calendar有容错性,当使用set()方法改变指定字段的值时,如果输入了不合法的参数,自动进位或者退位。
方法:
Calendar.setLenient(false); //关闭容错功能,进行参数检查
7.set()方法的延迟修改
set(f, value)方法将日历字段f更改为value;
尽管日历字段f是立即更改的,但是该Calendar所代表的时间却不会立即修改
知道下一次调用get(),getTime(),getTimeInMillis(),add()或者roll()时才会重新计算日历的时间。
好处是可以避免多次调用set()不会触发多次不必要的计算。
TimeZone类
1.抽象类,只能调用它的静态方法得到TimeZone实例public static TimeZone getDefault() //获得运行机器上的默认时区。
public staitc TimeZone getTimeZone(int id) //根据时区ID来获取时区
2.一些方法
static String[] getAvailableDs() //获取Java支持的所有的时区ID
static TimeZone getDefault() //
String getDisplayName() //获取当前TimeZone对象的时区名称
String getID() //获取时区的ID
static TimeZone getTimeZone(String ID); //
正则表达式
1.正则表达式是一个用于匹配字符串的模板,任意字符串都可以当成正则表达式使用2.Java提供了 Pattern 和 Matcher 两个类用于提供正则表达式支持。
3.String类中提供了几个特殊的方法:
boolean matches(String regex) //判断是否匹配指定正则表达式
String replaceAll(String regex, String replacement)
//返回匹配regex正则表达式的子串替换成replacement后的新字符串
String replaceFirst(String regex, String replacement)
//........................第一个子串替换成replacement后的新字符串
String[] split(String regex)
//根据给定的正则表达式拆分该字符串后得到的字符串数组
4.创建正则表达式
就是创建一个特殊的字符串
支持的合法字符
x (代表任何合法的字符)
\0mnn, \xhh, \uhhh, (8进制数代表的字符,16进制值代表的字符,16进制值代表的UNICODE字符)
\t, \n, \r, \f, (制表符,换行符,回车符,换页符)
\a, (报警符bell '\u0007')
\e, (Escape符 '\u001B')
\cx (x对应的控制符。 例如 \cM匹配Ctrl-M)
x (代表任何合法的字符)
\0mnn, \xhh, \uhhh, (8进制数代表的字符,16进制值代表的字符,16进制值代表的UNICODE字符)
\t, \n, \r, \f, (制表符,换行符,回车符,换页符)
\a, (报警符bell '\u0007')
\e, (Escape符 '\u001B')
\cx (x对应的控制符。 例如 \cM匹配Ctrl-M)
支持的特殊字符
1.有特殊的用途
2.如果需要匹配这些特殊字符,必须首先位于前添加反斜线\将这些字符转义。
$ ^
1.有特殊的用途
2.如果需要匹配这些特殊字符,必须首先位于前添加反斜线\将这些字符转义。
$ ^
匹配一行的结尾 匹配一行的开头
() []
标记子表达式的开始和结束位置 用于确定中括号表达式的开始和结束位置
{}
用于标记前面子表达式的出现频度
* + ?
子表达式出现零次或者多次 一次或者多次 零次或者一次
. \ |
匹配除换行符\n之外的任何单字符 用于转义 指定两项之间任选一项
使用“通配符”可以匹配多个字符,“通配符”远远超出了普通通配符的功能,被称为预定义字符:
. \d \D \s \S \w \W
任何字符 0~9 非数字 所有空白符 非空白符 0~9,a-z,A-Z,_ 所有非单字字符
(d:digit s:space
w:word)
方括号表达式表示枚举
1.表示枚举 例如 [abc],表示a,b,c其中任意一个字符
2.表示范围 例如 [a-f], 表示a~f范围内任意字符
3.表示求否:^ 例如 [^abc],表示非a,b,c的任意字符
4.表示“与”运算:&& 例如 [a-z&&[def]]:表示求z~z 和 [def]的交集,即 表示: d, e或者f
5.表示“并”运算 例如 并运算与前面表达式枚举类似
【方括号非常灵活,几乎可以匹配任何字符,如可以利用[\\u0041-\\u0056]形式:
因为所有中文字符的UNICODE值都是连续的】
因为所有中文字符的UNICODE值都是连续的】
圆括号表达式,圆括号可以使用或运算(|),
例如正则表达式 "(public|protected|private)" 用于匹配Java三个访问控制符之一
例如正则表达式 "(public|protected|private)" 用于匹配Java三个访问控制符之一
边界匹配符
^ $ \b \B \A \G \Z \z
行开头 行结尾 单词的边界 非单词的边界 输入的开头 前一个匹配的结尾 输入的结尾 输入的结尾
数量标示符
支持的数量标示符有三种模式:
Greedy(贪婪模式) :默认模式。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
eg:
X? X* X+ X{n} X{n,} X{n,m}
X表达式出现零或一次 零或多次 一或多次 出现n次 最少出现n次 出现n次到m次
Reluctant(勉强模式) :用问号后缀(?)表示,它只会匹配最少的字符。最小匹配模式
eg:
X?? X*? X+? X{n}? X{n,}? X{n,m}?
零次或者一次 零或多次 一或多次 出现n次 最少n次 出现n次到m次
Possessive(占有模式) :用加号后缀(+)表示,通常比较少用。
5.使用正则表达式
1.Pattern是不可变类,Pattern对象时正则表达式编译后再内存中的表示形式,可以供多个并发线程安全使用。
2.多个Matcher对象可以共享同一个Pattern对象。
3.Pattern,Mather 都位于 java.util.regex包中
4.定义了正则表达式之后,就可以使用Pattern和Matcher来使用正则表达式。
典型的调用顺序:
Pattern p = Pattern.compile("a*b");
//将一个字符串编译成Pattern对象
Matcher m = p.matcher("aaaab");
//使用Pattern对象创建Mather对象
boolean b = m.matches();
//renturn true;
如果正则表达式仅需要一次使用,可以直接使用Pattern类的静态matches方法,
会自动把指定字符串编译成匿名的pattern对象,并执行匹配,如:
boolean b = Pattern.matches("a*b", "aaaaab"); //返回true
【CharSequence接口:
CharSequence代表一个各种表示形式的字符串。
Pattern, Matcher, CharBuffer, String, StringBuffer, StringBuilder 都是它的实现类。
】
Matcher类提供的几个方法:
【通过Matcher类的find和group方法可以从目标字符串中依次取出匹配的子串】
【start和end方法主要用于确定子串在目标字符串中的位置】
【matches方法要求整个字符串和Pattern完全匹配时才返回true,
而lookingAt只要字符串以Pattern开头就会返回true。matches和lookingAt方法有些相似。
另外,String类中也提供了matches方法,例如:
【replaceALl,replaceFirst两个方法在String类中也有,也可以实现相同的功能】
boolean find()
//Attempts to find the next subsequence of the
// input sequence that matches the pattern.
// input sequence that matches the pattern.
//返回目标字符串中是否包含与Pattern匹配的子串。
String group()
//Returns the input subsequence matched by the previous match.
//返回上一次与Pattern匹配的子串
int start()
//Returns the start index of the previous match.
//返回上一次与pattern匹配的子串在目标字符串中开始的位置。
int end()
// Returns the offset after the last character matched.
//返回上一次与Pattern匹配的子串在目标字符串中结束位置加1.
boolean lookingAt() //返回目标字符串前面部分与Pattern是否匹配
boolean matches()
// 返回整个目标字符串与Pattern是否匹配
Matcher rest() //可以将现有的Matcher对象应用于一个新的字符序列。
String replaceAll(String replacement) //替换
String replaceFirst(STring replacement) //替换
程序国际化
1.Internationalization
2.Localization :本地化
3.Java语言内核基于UNICODE2.1编码集
4.Java开发工具提供了一些基本的本地化,国际化的类;
5.思路:
资源文件是 key-value对,key不变,value则随不同国家,语言而改变,值不需要使用双引号括起。
资源文件的命名的三种形式:
baseName_language_country.properties
baseName_language.properties
baseName.properties
6.Java的国际化三个类:
java.util.ResourceBundle
//用于加载一个国家,语言资源包
java.util.Locale
//用于封装一个特定的国家/区域,语言环境
java.text.MessageFormant
//用于格式化带占位符的字符串
7.显示Java语言支持的国家/语言环境
Locale 类中包含的静态方法:
public static Locale getDefault();
//得到系统默认的语言环境
public static Locale[] getAvailableLanguage();
public static String getDisplayCountry();
public static String getCountry();
public static String getDisplayLanguage();
public static String getLanguage();
8.完成程序国际化
1.先编辑一系列针对不同语言的具有相同baseName的资源文件,
例如:mess_zh_CN.properties,mess_en_US_properties,,,,
例如:mess_zh_CN.properties,mess_en_US_properties,,,,
2.对于非西欧字符的资源文件,在命令行窗口中使用java中的工具:
native2ascii;
eg: native2ascii mess_zh_CN.properties aa.properties
生成具有非西欧字符的UNICODE编码方式的properties文件,将其重命名需要的资源文件名规则。
3.程序(例子):
.....
Locale myLocale = Locale.getDefault();
//取得系统默认的国家语言环境
//取得系统默认的国家语言环境
ResourceBundle bundle = ResourceBundle.getBundle("mess" , myLocale);
//根据指定的语言环境加载资源文件
//根据指定的语言环境加载资源文件
System.out.println(bundle.getString("hello"));
//打印资源文件中取得的消息
//打印资源文件中取得的消息
4.重点方法:
//根据Locale加载资源文件
public static ResourceBundle getBundel(String baseName, Locale locale);
9.使用MessageFormat处理包含占位符的字符串
问题:如果需要处理输出的消息中包含动态内容的文本,文本的内容在程序执行后才能得到确认?
答案:将需要动态改变的内容使用占位符来处理。
1.{0},{1},,,,, 占位符使用大括号括起来的数字表示,数字从0开始记数。占位符位于资源文件中的value中。
2.主要方法:
static String format(String pattern, Object... arguments);
// pattern表示资源文件中的key,arguments 表示占位符的代替。
10.使用类文件代替资源文件
将所有的key-value对存入class文件,而不是属性文件,系统搜索class文件的优先级教高。
同时该文件必须满足条件:
1.类的名字必须为baseName_language_country,
2.该类必须继承
ListResourceBundle,并重写
getContents方法,该方法返回Object数组,该数组的每一个项都是key_value对。
11.使用NumberFormat,DateFormat格式化数字,日期(位于java.text包中)
|——MessageFormat (字符内容格式化)
Format(抽象类) -----|——
NumberFormat(抽象类) (数值格式化) :可以实现数值和字符串之间的双向转换
|——
DateFormat
(日期格式化) :可以实现日期和字符串之间的双向转换
NumberFormat 和DateFormat都包含了
format,parse方法用于实现转换
获得NumberFormat对象的几个工厂方法:
public static NumberFormat
getCurrencyInstance
: 返回默认Locale的货币格式器,可传入指定Locale获取相应格式器
public static NumberFormat
getIntegerInstance
: 返回默认Locale的整数格式器,可传入指定Locale获取相应格式器
public static NumberFormat
getNumberInstance
: 返回默认Locale的通用数值格式器,....
public static NumberFormat
getPercentInstance
: 返回默认Locale的百分数格式器,.....
获得DateFormat对象的几个工厂方法:
public static DateFormat
getDateInstance
; 格式化后的字符串只有日期,可以传入DateFormat.style,Locale参数
public static DateFormat
getTimeInstance
; 格式化后的字符串只有时间
public static DateFormat
getDateTimeInstance
; 格式化后的字符串有日期和时间
这3个方法都可以传入
DateFormat.style的四个静态常量: FULL,LONG,MIDIUM,SHORT
使用NumberFormat类将字符串解析成数值的意义不大(可以使用Integer,Double包装类完成这种解析)
Java提供了
SimpleDateFormat,因为使用DateFormat类解析日期字符串不够灵活:
1.构造器:
public SimpleDateFormat(String pattern)
:Constructs a SimpleDateFormat using the given pattern and the default date format symbols for the default locale.
构造一个SimpleDateFormat需要一个模板,
模板占位符:
y: m: d: h: z: ...
pattern是一个使用日期字段占位符的日期模板。
方法:
public String format(Date d);
//继承自DateFormat中的方法。
public String toLocalizedPattern()