SE高阶(9):Java自带的强大工具类(重点了解Files和Paths)

Java中有许多工具类可以帮助我们进行快捷开发,甚至可以基于原始方法进行二次开发,以便用于不同的使用场景,所以掌握一些常用工具类是很有用处的。接下来会简单介绍一些Java工具类的作用,感兴趣的可以去查看方法的实现源码。如果想了解更多工具类,可以通过JDK文档去查看java.util下的类或者百度。


工具类作用介绍

我们可以通过Java的命名风格得知类有啥用, 例如Arrays是用于操作数组的工具类,Collections是操作集合的工具类。工具类中都会提供大量静态方法,方便使用。接下来会对要介绍的工具类进行简要了解,这些类的所有具体方法这里不详述了。注意:Files 和 Paths是Java8新增的工具类,在处理文件方面功能非常强大。

  • Math:包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
  • Arrays:包含用来操作数组(比如排序和搜索)的各种方法。不支持二维数组。
  • Collections:包含用来操作集合(比如排序和搜索)的各种方法。
  • Paths:通过get()方法返回一个Path对象,Path用于表示文件路径和文件。
  • Files:提供了大量处理文件的方法,例如文件复制、读取、写入,获取文件属性、快捷遍历文件目录等.....

Math类方法实例

Math类可以很方便地处理一些简单的数学运算,还提供了两个静态字段:PI(圆周率)和E(自然对数的底数)。

public class MathTest {
	public static void main(String[] args) {
		System.out.println(Math.PI);//得到圆周率
		System.out.println(Math.E);//自然对底数
		//2的5次方
		System.out.println(Math.pow(2,5));
		//使用位运算求2的5次方
		System.out.println(1<<5);
		//对16开平方根
		System.out.println(Math.sqrt(16));
		//求两值之间最大、最小
		System.out.println(Math.max(5, 2));
		System.out.println(Math.min(5, 2));
		//三角函数
		System.out.println(Math.sin(60));//三角正弦
		System.out.println(Math.cos(60));//三角余弦
		System.out.println(Math.tan(60));//三角正切
	}
}

Arrays类方法实例

public class ArraysTest {
	public static void main(String[] args) {
		int[] arr = {72,52,54,63,42,65,46,12,34,6,43};
		String[][] str = { 
				{"A","B","C"}, {"D","E","F","G"} };
		//进行升序排序
		Arrays.sort(arr);
		//返回一个包含指定数组元素的字符串
		String arrStr  = Arrays.toString(arr);
		System.out.println(arrStr);
		//降序获取数组元素
		for(int i = arr.length-1; i >= 0 ; i--) {
			System.out.print(arr[i] + " ");
		}
		//把数组转成一个ArrayList对象,该对象由静态内部类维护
		List li = Arrays.asList(arr);
		//使用二分查找法(按升序)
		System.out.println("\n查询的值所在的index:" + Arrays.binarySearch(arr,46));
//		//对二维数组进行操作会出现错误
//		Arrays.sort(str);
	}	
  • 实例说明:Arrays工具类只能对一维数组进行操作,二维及以上会报异常。该工具类的常用方法sort()和binarySerach()默认是按照升序,也可以在参数中自定义比较规则。实现降序的方式就有很多种了,可以先排序然后反向遍历。或者转成集合,使用Collections的reserve()进行元素反转,又转成数组。也可以自己写排序方法。

Collections类方法实例

public class CollectionsTest {
	public static void main(String[] args) {
		ArrayList al = new ArrayList<>();
		al.add(18);
		al.add(35);
		al.add(-5);
		al.add(9);
		al.add(15);		
		System.out.println("原始元素序列:" + al);
		Collections.sort(al); //对集合元素进行升序排序
		System.out.println("排序之后:" + al);
		Collections.reverse(al);
		System.out.println("集合元素反转:" + al);
		/** 对指定List集合的两个index进行值交换*/
		Collections.swap(al, 1, 2);
		System.out.println("交换index=1,与index=2的值:" + al);
		/**获取集合元素中的最大值*/
		System.out.println("获取元素最大值:" + Collections.max(al));
		System.out.println("获取元素最小值:" +Collections.min(al));
		//元素随机化,shuffle英文意思:洗牌
		Collections.shuffle(al);
		System.out.println("元素随机:" + al);
		//把线程不安全集合类转成安全的集合类,很常用
		Collections.synchronizedList(al);		
	}
}
  • 实例说明:Collections提供了不少处理集合的方法,很方便。尤其是把线程不安全的集合类转成线程安全集合类,这样就无需担心那些集合类是安全的还是不安全的。上面的实例只是简要使用了Collecitons的方法,想了解更多用处请自行测试。

Files类与Paths类方法实例

Paths类实例

public class FilesTest {
	public static void main(String[] args) {
		//以当前路径作为Path对象
		Path p = Paths.get(".");
		//使用传入的字符串返回一个Path对象
		Path p2 = Paths.get("D","ReviewIO","URL");
		//对应的路径
		System.out.println("p对象的对应路径:" + p.toString());
		System.out.println("p2对象的对应路径:" + p2.toString());
		//路径数量是以路径名的数量作为标准
		System.out.println("p路径数量:" + p.getNameCount());
		System.out.println("p2路径数量:" + p2.getNameCount());		
		//获取绝对路径
		System.out.println("p绝对路径:" + p.toAbsolutePath());
		System.out.println("p2绝对路径:" + p2.toAbsolutePath());
		//获取父路径
		System.out.println("p父路径:"  + p.getParent());
		System.out.println("p2父路径:" + p2.getParent());
		//获取p2对象的文件名或者文件目录名
		System.out.println(p2.getFileName());
		//通过Path对象返回一个分隔符对象
		Spliterator split = p2.spliterator();
	}	
}
  • 实例说明:Paths类获取文件或文件目录路径可以使用采用多个字符串形式,也可以使用Path.get(D:\\ReviewIO\\URL)这种形式。返回的Path对象完全可以代替File类用于文件IO操作。

Files类实例

Files完成文件复制的方法,方法很简单。个人建议应该自己去实现一下文件复制功能,使用别的语言时,也能写出来该功能。
		Path source = Paths.get("F:","Java经典练习题.pdf");
		Path dest = Paths.get("F:","files.txt");
		File f = new File("F:\\ok.pdf");
		f.createNewFile();//如果f对象对应路径不存在就创建一个。	
		System.out.println("source对象的文件路径:" + source);
		//复制文件
		Files.copy(source, new FileOutputStream(f));

Files完成写入文件的方法
		//写入内容到文件
		ArrayList as = new ArrayList<>();
		as.add("A");
		as.add("B");
		as.add("C");
		Files.write(dest, as, Charset.forName("GBK"));
  • 实例说明:个人觉得用起来不怎么方便。方法参数很多,尤其是Iterable参数,Iterable是个顶级接口,实现类几乎都是集合类,并且限制了类型通配符上限是CharSequence,这意味着要使用泛型为字符类型的集合类作为数据写入指定文件中,很麻烦。
  • 如果只是简单写入内容到文件中,建议使用重定向标准输出流,然后使用打印流写入,简单粗暴。
使用Files类读取文件内容就不介绍了,个人觉得除了文件复制比较简洁通用,其他两个方法个人认为使用IO流或者NIO流比较方便一点。剩下来会介绍一些Files类的方法。
	public static void main(String[] args) throws IOException  {
		Path source = Paths.get("F:","Java经典练习题.pdf");	
		/** 返回值为boolean的操作方法样例 */
		System.out.println(Files.isHidden(source));//文件是否隐藏
		System.out.println(Files.isExecutable(source));//文件是否可执行
		System.out.println(Files.isWritable(source));//文件是否可写
		//获取Paths对象对应的文件路径的文件储存
		FileStore f  = Files.getFileStore(Paths.get("F:"));
		FileStore e = Files.getFileStore(Paths.get("E:"));
		System.out.println("F盘的总大小" + f.getTotalSpace());
		System.out.println("F盘的可用大小" + f.getUsableSpace());
		System.out.println("F盘的未分配空间" + f.getUnallocatedSpace());
				
	}

除了以上的方法之外,Files类还提供遍历文件和目录、监控文件变化、读取和设置文件权限、查看文件属性的方法,功能十分强大。




你可能感兴趣的:(Java基础笔记)