《io知识详解,通俗易懂,知识全面》由会员分享,可在线阅读,更多相关《io知识详解,通俗易懂,知识全面(42页珍藏版)》请在金锄头文库上搜索。
1、传智播客专注于 Java、.Net 和 Php、网页平面设计工程师的培训1第 8 章 IO(输入输出)本章重点 IO 流的概念 File 类 字节流 包装设计模式 字符流 其他 IO 流 随机访问文件类:RandomAccessFile 字符编码在日常生活中,经常会看到货物的运输,货物通过汽车等交通工具从一个仓库运输到另一个仓库。同样的,大多数应用程序都需要与外部设备进行数据交换,应用程序从设备把数据输入内存或把内存中的数据输出到设备,这些数据(比如图片,音乐或字符串)就好比货物,需要被传输,这种通过应用程序对设备数据的输入输出称为 IO 流。在 JDK 中定义了许多专门负责各种方式输入输出的
2、类,这些类都位于 java.io 包中。为了便于学习,按照 IO 流中操作数据的不同,IO 流可分为字节流和字符流,字节流主要用于处理像图片,音乐等二进制数据,字符流则主要用于处理像文本这样的数据,按照流方向的不同,字节流分为字节输入流和字节输出流,字符流分为字符输入流和字符输出流。如 图 8-1 所示。 I O 流字节流 字符流字节输入流 字节输出流 字符输入流 字符输出流图 8-1第八章 IO28.1 File 类IO 流是用来操作数据的,而文件是保存数据最常用的数据媒体,因此在应用程序中会经常对硬盘上的文件进行一些操作,比如创建一个文件,删除或者重命名某个文件,判断硬盘上某个文件是否存在
3、,查询文件最后修改时间等等,针对这类操作,JDK 定义了一个可以管理文件和目录的 File 类,本节将对File 类展开全面讲解。8.1.1 File 类的常用方法File 类用于封装系统文件和目录的相关信息,一个 File 实例表示真实文件系统中的一个文件或目录。创建一个 File 类可以通过其构造方法,下面介绍一下 File 类的常用构造方法,如 表 8-1 所示 。表 8-1 File 类常用的构造方法方法声明 功能描述File(String pathname) 通过指定的一个字符串类型的文件路径来创建一个新的 File 对象File(String parent,String child
4、) 根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个 File 对象File(File parent,String child) 根据指定的 File 类的父路径和字符串类型的子路径(包括文件名称)创建一个 File 对象表 8-1 中的三种构造方法都可以创建一个 File 对象,但是使用何种构造方法取决于程序所处理的文件系统。一般来说,如果程序只处理一个文件,那么使用第一个构造方法较方便。如果程序处理的是一个公共目录中的若干子目录或文件,那么使用第二个或者第三个构造方法会更方便。File 类是对文件和文件夹的抽象,它包含了文件和文件夹的多种属性和操作方法, F
5、ile 类的常用方法如 表 8-2 所示。表 8-2 File 类的常用方法方法声明 功能描述boolean exists() 判断 File 对象对应的文件或目录是否存在,若存在返回 ture,反之返回falseboolean delete() 删除 File 对象对应的文件或目录,若成功删除则返回 true,,否则返回false。boolean createNewFile() 当 File 对象对应的文件不存在时,该方法将新建一个此 File 对象所指定的新文件,若创建成功则返回 true,否则返回 falseString getName() 返回 File 对象表示的文件名或者目录名(如
6、果是目录,返回最后一级目录名)String getPath() 返回 File 对象对应的路径String getAbsolutePath() 返回 File 对象对应的绝对路径(在 Unix/Linux 等系统上,如果路径是以正斜线(/)开始,,则这个路径是绝对路径;在 Windows 等系统上,如果路径是以从盘符开始,则这个路径是绝对路径)String getParent() 返回 File 对象对应目录的父目录(即返回的目录不包含最后一级子目录)boolean canRead() 判断 File 对象对应的文件或目录是否可读,若可读则返回 true,反之返回falseboolean ca
7、nWrite() 判断 File 对象对应的文件或目录是否可写,若可写则返回 true,反之返回传智播客专注于 Java、.Net 和 Php、网页平面设计工程师的培训3falseboolean isFile() 判断 File 对象对应的是否是文件(不是目录) ,若是文件则返回 true,反之返回 falseboolean isDirectory() 判断 File 对象对应的是否是目录(不是文件) ,若是目录则返回 true,反之返回 false方法声明 功能描述boolean isAbsolute() 判断 File 对象对应的文件或目录是否是绝对路径long lastModified(
8、) 返回 1970 年 1 月 1 日 0 时 0 分 0 秒到文件最后修改时间的毫秒值;long length() 返回文件内容的长度long lastModified() 返回 1970 年 1 月 1 日 0 时 0 分 0 秒到文件最后修改时间的毫秒值File listFiles() 返回一个包含了 File 对象所有子文件和子目录的 File 数组表 8-2 中的一些方法,仅仅通过文字介绍很难弄清它们之间的区别,下面通过一个例程对 File 类中的常用方法进行演示,通过对运行结果的比较来更准确的理解这些方法。如例程 8-1 所示。 例程 8-1 Example01.javaimpor
9、t java.io.File;import java.io.IOException;public class Example01 public static void main(String args) File file = new File(d:example.txt); / 创建 File 文件对象if (file.exists() / 判断该文件是否存在file.delete(); / 如果存在,则删除 else / 如果不存在,创建一个try file.createNewFile(); catch (IOException e) e.printStackTrace();/ 获取文件名
10、称System.out.println(File name: + file.getName();/ 获取文件的相对路径System.out.println(File path: + file.getPath();/ 获取文件的绝对路径System.out.println(Abs path: + file.getAbsolutePath();/ 获取文件的父路径System.out.println(Parent: + file.getParent();/ 判断文件是否可读System.out.println(file.canRead() ? is readable : is not readab
11、le);/ 判断文件是否可写System.out.println(file.canWrite() ? is writeable: is not writeable);/ 判断是否是一个文件System.out.println(file.isFile() ? is : is not) + a file);第八章 IO4/ 判断是否是一个目录System.out.println(file.isDirectory() ? is : is not+ a directory);/ 判断是不是一个绝对路径System.out.println(file.isAbsolute() ? is absolute:
12、 is not absolute);/ 得到文件最后修改时间System.out.println(File last modified: + file.lastModified();/ 得到文件的大小System.out.println(File size: + file.length() + bytes);运行结果如 图 8-2 所示。图 8-2 运行结果8.1.2 遍历目录下的文件在上一小节中提到 File 类的一个常用方法 listFiles(),该方法用于遍历某个指定目录下的所有的文件,接下来通过一个案例来演示如何遍历目录下的所有文件,如例程 8-2 所示 。例程 8-2 Exampl
13、e02.javaimport java.io.File;public class Example02 public static void main(String args) File file = new File(D:cn); / 创建一个代表目录的 File 对象FileDir(file); / 调用 FileDir 删除方法public static void FileDir(File dir) if (dir.exists() / 判断传入的 File 对象是否存在File files = dir.listFiles(); / 得到 File 数组for (File file : f
14、iles) / 遍历所有的子目录和文件if (file.isDirectory() FileDir(file); / 如果是目录,递归调用 FileDir() else / 如果是文件,打印输出文件的绝对路径传智播客专注于 Java、.Net 和 Php、网页平面设计工程师的培训5System.out.println(file.toString();例程 8-2 的运行结果如 图 8-3 所示。图 8-3 运行结果在例程 8-2 中定义了一个静态方法 FileDir (),接收一个 File 类型的参数。在这个方法中,调用listFiles()方法把这个目录下所有的子目录和文件存到一个 Fil
15、e 类型的数组 files 中,然后遍历数组 files,如果是目录就重新调用 FileDir ()方法进行递归,如果是文件就直接打印输出,这样就可以成功的遍历出目录下的所有文件了。8.1.3 文件过滤器通过上一小节的学习,了解到如何得到指定目录下面的所有文件。但有时候,只想得到指定类型的文件,像播放音乐时,只想得到音乐格式的文件;查看图片时,只想得到图片格式的文件。JDK 中提供了一些可以得到指定目录下并满足指定条件的文件的方法,如 表 8-3 所示。表 8-3 过滤文件的方法方法声明 功能描述File listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。如果给定 filter 为 null,则接受所有路径名。File listFiles(FilenameFilter filter) 与前一个方法功能一致,只是传入的过滤器不一样。String list(FilenameFilter filter) 与前一个方法功能一致,只是返回值是文件的文件名。在 表 8-3 中,有三个过滤方法,在不同的情况下可以采用不同的方