案例一、FileReader读取字符数据
1、如果想从文件中直接读取字符可以使用字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。为了让初学者掌握FileReader字符流的使用,在案例中将针对一次读取一个字符的方式读取文本文件来学习。
设计思路(实现原理)
- 在项目目录下创建一个文本文件,在文件中输入内容“中”。
- 在main()方法中,通过FileReader(String fileName)构造方法创建字符输入流对象,并指定待读取文件txt的路径。
- 使用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文件中写入一串文字来学习。
设计思路(实现原理)
- 在main方法中,通过FileWriter(String fileName)构造方法创建字符输出流对象,并指定写入的文件路径。如果没有文件,则会自动创建一个文件出来。
- 通过write()方法将一段字符串直接写入到文件。
- 调用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进行显示)
- 在main()方法中使用File(String parent, String child)构造方法创建File文件对象
- 使用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、设计思路(实现原理)
- 在main()方法中使用File(String pathname)构造方法创建File文件对象,给定待遍历的目录的路径
- 编写fileDir()方法,并在该方法中使用File类的listFiles()方法获得目录下所有文件的数组,遍历数组,判断如果是目录,使用递归方式继续遍历,如果是文件则打印输出该文件的绝对路径
- 在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、设计思路(实现原理)
- 在main()方法中使用File(String pathname)构造方法创建File文件对象,指定删除的目录的文件夹
- 使用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();// 删除完一个目录里的所有文件后,就删除这个目录
}
}