上课内容及作业。File类的常用方法的使用、递归遍历目录及其子目录下的文件、使用delete()方法删除目录

案例一、FileReader读取字符数据

1、如果想从文件中直接读取字符可以使用字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。为了让初学者掌握FileReader字符流的使用,在案例中将针对一次读取一个字符的方式读取文本文件来学习。
设计思路(实现原理)

  1. 在项目目录下创建一个文本文件,在文件中输入内容“中”。
  2. 在main()方法中,通过FileReader(String fileName)构造方法创建字符输入流对象,并指定待读取文件txt的路径。
  3. 使用close()方法,关闭流资源。

2、案例实现

import java.io.*;
public class Exceptiondemo01 {
	public static void main(String []args) {
		Reader reader=null;
		try{
		reader=new FileReader("bry.txt");//导入文本路径
		int len=reader.read();
		System.out.println(len);//此处如果不加char则为Unicode编码,输出:20013。注意,中字是两个字节的
		System.out.println((char)len);//如果加上char则直接可以输出中字。
	}catch (IOException e) {
		// TODO: handle exception
	e.printStackTrace();
	}finally {
		if (reader!=null) {
			try {
			reader.close();
		}catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
			}
		}
	}
}

3、总结:FileReader和FileInputStream有非常多相似之处,但是FileReader每次读取的单位是一个字符,而FileInputStream每次读取的单位是一个字节。

案例二、FileWriter写入字符数据

1、我们学习过FileOutputStream写入数据,但是如果想向文本文件中写入字符数据,也可以使用FileWriter类。为了让初学者掌握FileWriter字符流的使用,案例中将通过FileWriter字符流向fw.txt文件中写入一串文字来学习。
设计思路(实现原理)

  1. 在main方法中,通过FileWriter(String fileName)构造方法创建字符输出流对象,并指定写入的文件路径。如果没有文件,则会自动创建一个文件出来。
  2. 通过write()方法将一段字符串直接写入到文件。
  3. 调用close()方法,关闭流资源。

2、案例实现

import java.io.*;

public class Exceptiondemo02 {
	public static void main(String[] args) {
		Writer w = null;
		try {
			w = new FileWriter("bry.txt");//如果没有文件,则会自动创建一个文件出来。
			w.write("我是好人"); // 此处为写入内容
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (w != null) {
				try {
					w.close();
				} catch (IOException e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}
	}
}

3、总结:FileWriter和FileOutputStream有非常多相似之处,但是FileWriter每次写入的单位是一个字符,而FileOutputStream每次写入的单位是一个字节。

案例三、将字节流转换为字符流( 转换流拷贝文件)

1、有时字节流和字符流之间也需要进行转换,这时就需要用到转换流。
在JDK中提供了两个类可以将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。
在这里我们演示InputStreamReader的转换方法
2、案例实现

import java.io.*;

public class Exceptiondemo03 {
	public static void main(String []args) {
		InputStream is=null;
		try{
		is=new FileInputStream("bry.txt");//必须是文本文件,不能是其他的,这里为字节流
		InputStreamReader i=new InputStreamReader(is);//在这里进行转换,这里得到的是字符流
		System.out.println((char)i.read());//此处输出的就是一个字符,而且还经过char强转
	}catch (IOException e) {
		// TODO: handle exception
	e.printStackTrace();
	}finally {
		if (is!=null) {
			try {
			is.close();
		}catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
			}
		}
	}
}
	

3、总结:在使用转换流时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为字符流就会造成数据丢失。


作业一、 File类的常用方法的使用

1、在开发过程中涉及到文件有关的内容时,我们经常会使用到File类,该类中拥有一系列的方法,对于初学者来说很难弄清它们之间的区别,为了让大家熟悉File类中的常用方法,本案例将演示File类中的方法对文件进行操作来学习方法的使用。
2、设计思路(实现原理:直接调用API进行显示)

  1. 在main()方法中使用File(String parent, String child)构造方法创建File文件对象
  2. 使用File类的方法对该文件进行各种操作,包括判断文件是否存在,判断是否是文件,获取文件名称,获取文件大小,获取最后修改时间等等。

二、案例实现

import java.io.*;
import java.sql.Date;
import java.text.DateFormat;

public class Exceptiondemo04 {
	public static void main(String[] args) throws IOException {
		File file = new File("w.txt");// 创建File文件对象,表示一个文件
		System.out.println("文件是否存在:" + (file.exists() ? "存在" : "不存在"));// 判断文件是否存在
		if (!file.exists()) {// 如果文件不存在便创建该文件
//File类中的createNewFile()方法,当文件存在时不会创建,该方法返回值为false,文件不存在时才创建,如果创建成功,该方法返回值为true。
			boolean f = file.createNewFile();//
			System.out.println("文件是否创建成功:" + f);
		}
		//以上都不要也可以,换成下面的,就可直接查看现有的文件,而不必重新创建
	//public static void main(String []args){
		//File file=new File("C:\\Users\\Desktop\\A");//括号里输入文件的详细路径
		System.out.println("文件名称:" + file.getName());// 获取文件名
		System.out.println("文件的相对路径:" + file.getPath());// 获取文件的相对路径
		System.out.println("文件的绝对路径:" + file.getAbsolutePath());// 获取文件的绝对路径
		System.out.println("文件的父路径:" + file.getParent());// 获取文件的父路径
		System.out.println(file.isDirectory() ? "是一个目录" : "不是一个目录");// 判断是否是一个目录
		System.out.println(file.isAbsolute() ? "是绝对路径" : "不是绝对路径");// 判断是否是一个绝对路径
		System.out.println(file.isHidden() ? "是隐藏文件" : "不是隐藏文件");// 判断是否是一个隐藏文件
		System.out.println(file.isFile() ? "是一个文件" : "不是一个文件");// 判断是否是一个文件
		System.out.println(file.canRead() ? "文件可读" : "文件不可读");// 判断文件是否可读
		System.out.println(file.canWrite() ? "文件可写" : "文件不可写");// 判断文件是否可写
		long time = file.lastModified();// 得到文件最后修改时间,并将毫秒数转成日期
		Date d = new Date(time);//在这里还使用了DateFormat类,将File类中的lastModified()方法返回的毫秒值转换成了日期,显示更直观
		String date = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(d);
		System.out.println("最后修改时间为:" + date);//查看最后修改的时间
		System.out.println("文件大小为:" + file.length() + " bytes");// 获取文件的字节大小
	}
}

3、总结:
File类有三个常用构造方法,如下表所示:

方法声明 功能描述
File(String pathname) 通过指定的一个字符串类型的文件路径来创建一个新的File对象
File(String parent,String child) 根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象
File(File parent,String child) 根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象

这三种常用构造方法创建File对象可以都使用,示例代码如下:

    // 方式1: File(String pathname) 
	File file = new File("c:\\a.txt");
    // 方式2: File(String parent,String child)
    File file = new File("c:", "a.txt");
    // 方式3: File(File parent,String child) 
    File parentfile = new File("c:");
	File file = new File(parentfile, "a.txt");

作业二、 递归遍历目录及其子目录下的文件

1、在一个目录下,除了文件,常常还会有子目录,如果想得到所有子目录下的File类型对象,就需要遍历整个目录及其子目录,在File类中提供了listFiles(),该方法返回一个File对象数组,由于元素中可能还有子目录需要遍历,因此需要使用递归。

2、设计思路(实现原理)

  1. 在main()方法中使用File(String pathname)构造方法创建File文件对象,给定待遍历的目录的路径
  2. 编写fileDir()方法,并在该方法中使用File类的listFiles()方法获得目录下所有文件的数组,遍历数组,判断如果是目录,使用递归方式继续遍历,如果是文件则打印输出该文件的绝对路径
  3. 在main()方法中调用fileDir()方法,并传入待遍历的File对象

二、案例实现

1、获取当前路径下的文件及目录,即只能查看一级目录,而无法查看更深层的目录

import java.io.File;
public class Exceptiondemo07 {
//	public static void main(String[] args) {
//		File file = new File("C:\\Users\\PW\\Desktop\\A");// 这样只能删除一个空目录,如果文件夹里面有内容则无法删除
//		file.delete();
//	}
	public static void main(String[] args) {
		File file = new File("C:\\Users\\PW\\Desktop\\A");
		deleteFile(file);//调用deleteDir删除方法进行删除
	}
	public static void deleteFile(File dir) {
		File[]files=dir.listFiles();//得到File数组
		for(File f:files) {//遍历所有的子目录和文件
			if(f.isDirectory()){
				deleteFile(f); // 如果是目录,递归调用deleteDir()
			}else {
				f.delete();//如果是文件,直接删除
			}
		}
		dir.delete();// 删除完一个目录里的所有文件后,就删除这个目录
	}
}

2、遍历目录及其子目录下的文件

import java.io.*;

public class Exceptiondemo06 {
	public static void main(String[] args) {
		File dir = new File("C:\\Users\\HX\\Desktop\\A");// 注意,这里必须要存在这个文件夹,否则会报错。
		listFile(dir);
	}

	public static void listFile(File dir) {

		File[] files = dir.listFiles();// 得到一个文件数组,将一级目录的所有文件进行展示。
		for (File f : files) {// 对文件进行遍历
			if (f.isDirectory()) {// 这里提供了一个方法,判断是否为一个目录
				listFile(f);// 继续调用方法,对文件夹里的内容输出。方法里面调用本身,递归
			} else {// 如果不是目录,则输出文件的绝对路径
				System.out.println(f.getAbsolutePath());
			}
			System.out.println(f.getAbsolutePath());
		}

	}
}

作业三、使用delete()方法删除目录

一、案例描述
1、在操作文件时,经常需要删除一个目录下的某个文件或者删除整个目录,这时可以使用File类提供的delete()方法进行删除。
2、设计思路(实现原理)

  1. 在main()方法中使用File(String pathname)构造方法创建File文件对象,指定删除的目录的文件夹
  2. 使用File类的exists()方法判断该文件是否存在,如果存在就使用delete()方法对其进行删除操作

二、案例实现

import java.io.File;
public class Exceptiondemo07 {
//	public static void main(String[] args) {
//		File file = new File("C:\\Users\\PW\\Desktop\\A");// 这样只能删除一个空目录,如果文件夹里面有内容则无法删除
//		file.delete();
//	}
	
	public static void main(String[] args) {
		File file = new File("C:\\Users\\PW\\Desktop\\A");
		deleteFile(file);//调用deleteDir删除方法进行删除
	}
	public static void deleteFile(File dir) {
		File[]files=dir.listFiles();//得到File数组
		for(File f:files) {//遍历所有的子目录和文件
			if(f.isDirectory()){
				deleteFile(f); // 如果是目录,递归调用deleteDir()
			}else {
				f.delete();//如果是文件,直接删除
			}
		}
		dir.delete();// 删除完一个目录里的所有文件后,就删除这个目录
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章