Math&Random
File
Date&DateFormat
BigDecimal&NumberFormat
Math类在Java中常用于数学运算相关操作,例如,绝对值,三角函数,比较大小等,Math类中所有方法都是static方法,因此直接通过类名称调用即可
Math常用方法:
Math.abs(-100); //取绝对值:100
Math.max(10,15);//返回两个数中较大的一个:15
Math.min(10,15);//返回两个数中较小的一个:10
Math.ceil(3.14);//向上取整:4
Math.floor(3.14);//向下取整:3
Math.round(3.14);//四舍五入:3
Math.pow(m,n);//计算获取m的n次幂
Math.random();//获取0.0~1.0(不含)之间的随机数
Random类用于生成伪随机数流,通过random可以随机生成不同数据类型数据,例如:整数,浮点数,布尔值等
Random示例代码:
Random r = new Random();
int i = r.nextInt(10);//随机获取从0-9之间的整数
boolean b = r.nextBoolean();//随机获取boolean值
Java中File类用于表示一个标准文件或者目录对象,通过File提供的构造器和方法可以方便的操作本机磁盘中 的文件与目录,File相关示例代码:
//返回与系统相关的路径分隔符
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
//返回与系统有关的目录分隔符 window:\ Linux:/
System.out.println(File.separator);
System.out.println("d:/test"+File.separator+"t.txt");
System.out.println("d:/test/t.txt");
//根据给定文件或目录的绝对或者相对路径创建File对象
File file = new File("D:/fileTest");
//删除指定的File对象,如果file对象表示的是目录且目录中无子文件或子目录则可以删除,对于标准文件可以直接删除
System.out.println(file.delete());
file = new File(file,"test/新建文本文档.txt");
//判断当前file对象表示的文件或目录是否存在
System.out.println(file.exists());
file = new File("d:/fileTest","test/新建文本文档.txt");
System.out.println(file);
file = new File("d:/fileTest/hello");
//判断指定File对象所表示的目录或者文件是否存在
if(!file.exists()){
//创建当前文件(标准文件)
System.out.println(file.createNewFile());
}
file = new File("d:/fileTest/java/project/myfiles");
//创建指定file对象所表示的目录
System.out.println( "目录创建结果:"+file.mkdir());
//创建指定file对象所表示的目录(可以创建多级目录)
System.out.println("多级目录创建:"+file.mkdirs());
/**************************************************/
File file = new File("D:\\fileTest\\helloworld.txt");
//立即删除文件
// file.delete();
file.deleteOnExit();
System.out.println("运行中...");
// Thread.sleep(10000);
System.out.println("结束");
file = new File("D:\\fileTest\\java\\project\\myfiles\\hello.txt");
//获取当前文件对象所在磁盘的剩余空间(字节)
System.out.println(file.getFreeSpace());
//获取File对象所表示的文件或者目录名称
System.out.println(file.getName());
//获取指定file对象所在的父路径(字符串)
System.out.println(file.getParent());
//获取指定file对象所在的父路径(File对象)
System.out.println(file.getParentFile());
//获取File对象表示的文件的绝对路径
System.out.println(file.getPath());
//获取当前File对象所表示文件所在磁盘的总空间
System.out.println(file.getTotalSpace());
file = new File("src/com/softeem/file/HelloWorld.java");
file.createNewFile();
//判断当前File所表示的文件是否是绝对路径
System.out.println(file.isAbsolute());
//判断当前File对象表示的是否是一个目录
System.out.println("是否是目录:"+file.isDirectory());
//判断当前File对象表示的是否是一个标准文件
System.out.println("是否是标准文件:"+file.isFile());
System.out.println(System.currentTimeMillis());
System.out.println("文件的最近一次修改时间:"+file.lastModified());
//获取文件的大小(字节)
System.out.println(file.length());
续:
File file = new File("D:\\fileTest\\helloworld.txt");
//立即删除文件
// file.delete();
//当jvm结束时删除
file.deleteOnExit();
System.out.println("运行中...");
// Thread.sleep(10000);
System.out.println("结束");
file = new File("D:\\fileTest\\java\\project\\myfiles\\hello.txt");
//获取当前文件对象所在磁盘的剩余空间(字节)
System.out.println(file.getFreeSpace());
//获取File对象所表示的文件或者目录名称
System.out.println(file.getName());
//获取指定file对象所在的父路径(字符串)
System.out.println(file.getParent());
//获取指定file对象所在的父路径(File对象)
System.out.println(file.getParentFile());
//获取File对象表示的文件的绝对路径
System.out.println(file.getPath());
//获取当前File对象所表示文件所在磁盘的总空间
System.out.println(file.getTotalSpace());
file = new File("src/com/softeem/file/HelloWorld.java");
file.createNewFile();
//判断当前File所表示的文件是否是绝对路径
System.out.println(file.isAbsolute());
//判断当前File对象表示的是否是一个目录
System.out.println("是否是目录:"+file.isDirectory());
//判断当前File对象表示的是否是一个标准文件
System.out.println("是否是标准文件:"+file.isFile());
System.out.println(System.currentTimeMillis());
System.out.println("文件的最近一次修改时间:"+file.lastModified());
//获取文件的大小(字节)
System.out.println(file.length());
FileFilter是一个用于完成文件过滤的接口,FileFilter接口提供了一个用于社子和过滤规则的抽象方法,若在获取文件列表时需要进行过滤,则可提供FileFilter对象并实现accept方法以完成文件过滤,如下
//创建File对象,表示d盘下的fileTest目录
File file = new File("d:/fileTest");
//过滤所有的标准文件(匿名内部类)
files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile();
}
});
文件过滤原理:
通过查看 listFiles(FileFilter filter)方法源码不难发现,文件过滤原则即从文件列表中遍历所有文件,并根据accept实现的过滤规则判断每一个文件是否满足过滤条件,若满足则将该文件存储到新的容器ArrayList中,最终将ArrayList以File数组的形式返回,即完成过滤过程,源码如下:
public File[] listFiles(FileFilter arg0) { //获取目标文件的文件名数组 String[] arg1 = this.list(); if (arg1 == null) { return null; } else { //创建新数组用于存储符合过滤条件的文件 ArrayList arg2 = new ArrayList(); String[] arg3 = arg1; //获取所有文件总数 int arg4 = arg1.length; //循环遍历每一个文件 for (int arg5 = 0; arg5 < arg4; ++arg5) { //取出每一个遍历到的文件名并使用临时变量存储 String arg6 = arg3[arg5]; //根据文件名构建一个新的文件对象 File arg7 = new File(arg6, this); //判断新文件对象是否符合accept方法实现的过滤规则 if (arg0 == null || arg0.accept(arg7)) { //若符合过滤规则则将该文件加入新集合中 arg2.add(arg7); } } //将集合转换为File数组并返回,完成过滤 return (File[]) arg2.toArray(new File[arg2.size()]); } }
java中可以使用java.util.Date表示一个日期对象,Date目前仅提供两个未过时的构造器完成对象创建,其余均标记为已过时(参考java.util.Calendar),并且Date类中大多数方法也已标记为过时,不推荐使用(参考java.util.Calendar类)
//根据当前系统时间创建Date对象
Date date = new Date();
//根据提供的时间毫秒数创建Date对象
date = new Date(System.currentTimeMillis())
//获取date对象表示的时间毫秒数(从1970年01月01日 00:00:00开始
long time = date.getTime();
由于Date类型默认的输出格式为欧美日期格式:Fri Jul 20 15:33:37 CST 2018;在国内环境下难以理解,因此,jdk也提供了用于对日期进行格式化处理的类DateFormat和SimpleDateFormat(DateFormat的子类),我们可以根据需求个性化的定制时间显示格式,DateFormat内部包含了部分方法用于格式化日期或者日期时间,如果需要定制则可以通过SimpleDateFormat实现,具体示例代码如下:
//获取当前系统时间对象
Date d = new Date();
//获取日期格式化对象
DateFormat fmt = DateFormat.getDateInstance();
fmt.format(d); //2018-7-20
//获取日期时间格式化对象
fmt = DateFormat.getDateTimeInstance();
fmt.format(d);//2018-7-20 16:10:11
//若需要将显示的时间个性化处理如:2018年07月20日 16时10分11秒 则可通过SimpleDateFormat实现
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
sdf.format(d);//2018年07月20日 16时10分11秒
//如何将字符串类型日期转换为Date类型对象?
String t1 = "2017/08/01 12:12:12";
String t2 = "2017/07/01 12:12:12";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//将字符串类型的日期解析为Date类型
Date d1 = sdf.parse(t1);
Date d2 = sdf.parse(t2);
java中进行浮点数运算时由于计算机底层运算问题可能导致精度丢失,例如:
double d1 = 0.3;
double d2 = 0.2;
System.out.println(d1 - d2);//0.199999999999998
针对以上算术运算预期值应该是:0.2,但是实际结果确是:0.19999999999999998;如果用于表示金额等敏感数值则可能引起极大错误,因此对于精度要求较高的浮点数运算时,通常使用BigDecimal类型处理,具体如下:
BigDecimal d1 = new BigDecimal("0.3");
BigDecimal d2 = new BigDecimal("0.1");
//相加
BigDecimal add = d1.add(d2));
//相减
BigDecimal subtract = d1.subtract(d2);
//相乘
BigDecimal multiply = d1.multiply(d2);
//相除
BigDecimal div = d1.divide(d2);
//取余
System.out.println(d1.remainder(d2));
/*针对以上相除运算如果反过来使用d2处以d1则会导致小数点后无穷大,从而引发ArithmeticException异常,
因此针对以上问题,应该采用
divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
divisor 表示除数
scale 精度(小数点后保留位数)
roundingMode 舍入模式
方法设置数值精度来避免异常,如下:
*/
BigDecimal div2 = d2.divide(d1,2,RoundingMode.HALF_UP);
//针对以上结果若想转化为其他基本数据类型则可使用以下方法解决:
//div2.intValue()
//div2.doubleValue()
//...
在表示一个数值时通常根据项目的不同需求可能需要显示为不同的格式,比如:货币,百分比等,此时可以通过NumberFormat&DecimalFormat进行解决,如下:
double d = 432765123.89653;
//使用标准显示格式
String s = NumberFormat.getInstance().format(d);//结果:432,765,123.897
//显示为货币格式
s = NumberFormat.getCurrencyInstance().format(d);//结果:¥432,765,123.897
d = 0.5456;
//显示为百分比
s = NumberFormat.getPercentInstance().format(d);//结果:54%
以上为默认的数值格式化工具,但是针对某些特定需求(比如数值d要求保留小数点后两位,默认为3位;百分比值要求保留一位小数,默认取整),默认的格式化工具可能无法完全满足需求,此时可以通过DecimalFormat定制个性化需求:
double d = 432765123.88653;
DecimalFormat fmt = new DecimalFormat("##,###.##");
fmt.format(d);//结果:432,765,123.89
double d = 0.5456
DecimalFormat fmt = new DecimalFormat("##.#%");
fmt.format(d);//结果:54.6%