1.File类的使用 1.1 File类的作用 1.2 File类的构造方法 1.3 File类文件属性方法 1.4 File类的使用练习 2.IO流 2.1 什么是IO流 2.2 流的作用和原理 2.3 IO流的分类 2.4 字节输入流 2.5 字节输出流 2.6 字符输入流 2.7 字符输出流
1.了解File类的作用 2.掌握File类的构造方法和常用成员方法 3.掌握流的作用和原理 4.了解流的分类 5.掌握字符流和字节流的使用
在java程序中,对磁盘文件进行描述的类。文件和目录路径名的抽象表示形式。
| 方法名 | 描述 |
|---|---|
| File(File parent, String child) | 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
| File(String pathname) | 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
| File(String parent, String child) | 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
属性:
static String pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串(;)。 static char pathSeparatorChar:; static String Separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串(\)。 static char SeparatorChar:\
xxxxxxxxxx //分号 System.out.println(File.pathSeparator); System.out.println(File.pathSeparatorChar); //反斜杠 System.out.println(File.separator); System.out.println(File.separatorChar);方法:
| 返回值 | 方法名/描述 |
|---|---|
| boolean | canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 |
| boolean | canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
| boolean | canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
| int | compareTo(File) 按字母顺序比较两个抽象路径名。 |
| boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
| boolean | createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建个新的空文件。 |
| boolean | delete() 删除此抽象路径名表示的文件或目录。 |
| File | getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。 |
| String | getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
| File | getCanonicalFile() 返回此抽象路径名的规范形式。 |
| String | getCanonicalPath() 返回此抽象路径名的规范路径名字符串。 |
| String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
| String | getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 |
| File | getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录则返回 null。 |
| String | getPath() 将此抽象路径名转换为一个路径名字符串。 |
| boolean | isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
| boolean | isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
| boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
| String[] | list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
| boolean | mkdir() 创建此抽象路径名指定的目录。 |
| boolean | mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
| boolean | renameTo(File dest) 重新命名此抽象路径名表示的文件。 |
| File[] | listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
代码实现一:
xxxxxxxxxx File file = new File("d:\\a.txt");//创建一个文件对象,表示d盘的a.txt文件 System.out.println(file.canExecute()); System.out.println(file.canWrite()); System.out.println(file.canRead()); System.out.println(file.isHidden());代码实现二:
xxxxxxxxxx File file = new File("d:\\a"); File f = new File("d:\\b.txt"); System.out.println(file.compareTo(f)); //exists方法:判断文件抽象路径表示的文件或目录是否存在 System.out.println(file.exists()); //createNewFile方法:创建一个新的空文件(若存在则创建失败) System.out.println(f.createNewFile()); //delete方法:只能删除文件和空文件夹,非空文件夹不能使用delete方法删除 System.out.println(f.delete()); System.out.println(file.delete());代码实现三:
xxxxxxxxxxpublic class Demo { public static void main(String[] args) throws IOException { //现有d:\\a\\b\\hello.txt //要求:在hello.txt相同的目录下创建出一个world.txt文件 File f1 = new File("d:\\a\\b\\hello.txt"); System.out.println(f1.getPath()); fun(f1); } //设计一个方法,在某个文件的相同目录下创建出一个新文件(新建文本文档.txt) /* * 分析: * 返回值:不需要 * 参数:一个File对象 * getParent方法 * createNewFile方法 * 构造方法 */ public static void fun(File file) throws IOException { //获取父路径 String parent = file.getParent(); //创建File对象 File f = new File(parent, "新建文本文档.txt"); //创建新文件 f.createNewFile(); }}代码实现四:
xxxxxxxxxx File file = new File("d:\\a\\hello.txt"); System.out.println(file.exists()); System.out.println(file.isDirectory());//判断一个File对象是否是文件夹 System.out.println(file.isFile());//判断一个File对象是否是文件 String[] files = file.list();//获取文件夹中所有子文件夹和文件的名称(字符串形式) System.out.println(files.length); for(String s:files) { System.out.println(s); } File[] fs = file.listFiles();//获取文件件中所有子文件夹和文件的抽象路径(File对象) System.out.println(fs.length); for(File f:fs) { System.out.println(f); } xxxxxxxxxx File file = new File("d:\\aa\\bb\\cc\\dd\\a.txt"); //在创建一个文件时,需要先判断父目录是否存在,若不存在则创建父目录 File parent = file.getParentFile(); if(!parent.exists()) { System.out.println(parent.mkdirs());//创建一个新的空文件夹 } System.out.println(file.createNewFile()); //对文件重命名 File file = new File("d:\\a.txt"); File f = new File("a.txt"); File f1 = new File("hello\\hello.txt"); System.out.println(file.renameTo(f));//将file表示文件重命名为f时,必须保证file是存在的文件 System.out.println(f.renameTo(f1));代码实现:
xxxxxxxxxxpublic class FileUsageDemo02 { public static void main(String[] args) { String string = "C:\\Users\\Administrator\\Desktop\\HZ-J2ee1709\\Day16"; method1(string); method2(string); } //需求一:列出指定目录下所有子文件夹以及子文件 public static void method1(String path) { File file = new File(path); //list //子文件或者子文件夹的名称 String[] arr = file.list(); for(String str:arr) { System.out.println(str); } } /** * 需求二:列出指定目录下所有子文件夹以及子文件,要求格式如下: * 子文件: isFile() * 。。。。 * 子文件夹:isDirectory() * 。。。。 */ public static void method2(String path) { File file = new File(path); //获取指定路径下所有File对象 //listFiles() File[] files = file.listFiles(); for(File f:files) { if(f.isFile()) { System.out.println("子文件:"); //获取每个文件的名字 System.out.println(f.getName()); } else if(f.isDirectory()) { System.out.println("子文件夹:"); System.out.println(f.getName()); } } } //需求:列出指定目录下所有后缀为.java的文件 public static void method3(String path) { //endsWith File file = new File(path); String[] arr = file.list(); for(String str:arr) { if(str.endsWith(".java")) { System.out.println(str); } } }}在工作中,经常回去操作磁盘上的资源,这个过程中实现了数据的输入和输出操作,磁盘上的文件和内存之间进行交互,数据的交互需要有一个媒介或者管道,把这个媒介或者管道就称为IO流,也被称为输入输出流【I:Input O:Output】
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
2.3.1 按照流的流向分:输入流、输出流
输入流:表示将数据读取到java程序(内存)中使用的流。 输出流:表示从java程序(内存)向外传输使用使用的流。
2.3.2 按照数据单位分:字符流、字节流
字节流:一次性传输一个字节数据,将数据以字节的形式传输。 字符流:一次性传输一个字符数据,将数据以字符的形式传输。
2.3.3 按照层次分:节点流、处理流
节点流:可以从或向一个特定的地方(节点)读写数据。 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
2.4.1 InputStream类的常用方法
InputStream是一个抽象类,不能实例化对象。
| 方法名 | 描述 |
|---|---|
| void close() | 关闭此输入流并释放与该流关联的所有系统资源。 |
| int read() | 从输入流中读取数据的下一个字节。 |
| int read(byte[] b) | 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。 |
| int read(byte[] b,int off, int len) | 将输入流中最多len个数据字节读入 byte 数组。 |
2.4.2 文件输入流FileInputStream
xxxxxxxxxxpublic class DemoFileInputStream { public static void main(String[] args) { //创建被操作文件:此文件必须存在,否则读取时,抛出文件找不到异常 File file = new File("test\\hello.txt"); //声明流,不初始化 FileInputStream fis = null; try { //初始化流 fis = new FileInputStream(file); //准备数组用来存储数据 byte[] b = new byte[3]; //先定义一个变量,初始值是-1 int i = -1; //定义一个计数循环的变量 int count = 0; //while循环读取 while((i=fis.read(b))!=-1) { count++; for(int j=0; j<i; j++) { System.out.print((char)b[j]); } } System.out.println(count);//计数:计算循环读取的次数 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(fis!=null) { try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}2.5.1 OutputStream类的常用方法
OutputStream是抽象类,不能实例化对象。
| 方法名 | 描述 |
|---|---|
| void close() | 关闭此输出流并释放与此流有关的所有系统资源。 |
| void flush() | 刷新此输出流并强制写出所有缓冲的输出字节。 |
| void write(byte[] b) | 将 b.length 个字节从指定的 byte 数组写入此输出流。 |
| void write(byte[] b,int off, int len) | 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 |
| void write(int b) | 将指定的字节写入此输出流。 |
2.5.2 文件输出流FileOutputStream
xxxxxxxxxxpublic class TestFileOutputStream { public static void main(String[] args) { //向文件中写入数据 //在工程中创建一个test文件夹 //设计程序,向test\\hello.txt中写入hello world //第一步:创建被操作文件对象 //当向一个文件中写入数据时,若文件不存在,程序会自动创建 File file = new File("test\\hello.txt"); FileOutputStream fos = null; try { //第二步:创建流对象 fos = new FileOutputStream(file, true); //第三步:准备数据 String str = "hello world"; byte[] b = str.getBytes(); System.out.println(b.length); //第四步:使用流写入 fos.write(b); }catch(IOException e) { e.printStackTrace(); } finally { if(fos!=null) { try { //第五步:刷新流,关闭流 fos.flush(); fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}Reader类
Reader:是所有字符输入流的父类,为一个抽象类,不能实例化对象,使用它的子类FileReader类
xxxxxxxxxxpublic class FileReaderUsageDemo { public static void main(String[] args) { //1.将文件的路径转换为File对象 File file = new File("file/input1.txt"); Reader reader = null; try { //2.实例化一个FileReader的对象 reader = new FileReader(file); //3.定义一个数组 char[] arr = new char[8]; //4.定义一个int的变量 int hasRead = 0; //5.循环读取 while((hasRead = reader.read(arr)) != -1) { String result = new String(arr, 0, hasRead); System.out.println(result); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //避免出现空指针异常 if(reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }}Writer类
Writer:是所有字符输出流的父类,为一个抽象类,不能实例化对象,使用它的子类FileWriter类
xxxxxxxxxxpublic class FileWriterUsageDemo { public static void main(String[] args) throws IOException { File file = new File("file/output1.txt"); Writer writer = new FileWriter(file); //写入 //注意:区别于字节流,可以直接传字符串 writer.write("天边最美的云彩"); writer.flush(); writer.close(); }}1.自定义一个类Person,将多个Person对象添加到TreeSet中,并按照年龄进行降序排序 2.向一个HashMap集合中添加几对键值对,使用增强for循环将key和value遍历出来 3.简述HashMap和HashSet之间的区别
1.总结集合中的内容,完善笔记 2.创建HashMap对象,向集合中加入5个键值对,采用课上的三种方式遍历集合,打印出所有的键值对 3.创建TreeMap对象,key值采用Student自定义类型,value值为String类型,表示学生的喜好,要求按照年龄升序排序,如果年龄相同,则按照成绩降序排序 4.在控制台输入一句英语, 获得每个字母出现的次数,注:每个字符作为key,出现的次数作为value 7.列出指定目录下所有扩展名为.txt的文件 8.递归删除文件,如果文件不存在,则抛出一个文件不存在的自定义异常 9.利用流实现文件内容的拷贝
1.什么是IO流,有什么作用 2.IO流都有哪些分类?依据是什么?