<黑马程序员> 第七篇:IO

来源:互联网 发布:苹果开发必备软件 编辑:程序博客网 时间:2024/06/05 07:19
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

7.1  IO概述
7.1.1 IO流的概念

大多数应用程序都要操作外部设备上的数据,如把U盘上的文件全部拷贝到计算机硬盘上,这是就需要数据传输。在JavaAPI中提供了一些操作数据的类和接口,它们把不同的输入/输出的设备(键盘、内存、显示器、网络等)之间进行的数据传输抽象表述为“流”的形式,这样能够直观的展现数据的输入输出方式。Java中的这些类和接口都放在java.io包中,称为IO(输入/输出)流。

其实,“流”就是数据传输的通道。


7.1.2 IO流的分类

按操作数据的不同:字节流、字符流

按数据传输的方向:输入流、输出流

 
7.2 File类

用于管理磁盘上的文件和目录

 

7.2.1 历遍目录下的文件
import java.io.File;public class E1 {   public static void main(String[] args) {      File file = new File("d:\\JDK");      FilDir(file);   }   public static void FilDir(File dir) {      if (dir.exists()) {         File[] files = dir.listFiles();                //得到File数组         for (File file : files) {                 //遍历所有的子目录和文件            if (file.isDirectory()) {               FilDir(file);                    //如果是目录,递归并调用FileDir()            }else {                System.out.println(file.getPath());    //如果是文件,打印输出文件的路径            }         }      }   }}


7.2.2 文件过滤器

用于获取指定类型的文件。

黑马程序员 第八篇:IO - jeffsong0919 - 小宋的博客

列出了三个方法,均用于过滤文件。

当判断逻辑中要使用的是文件的属性,那么调用第一个方法比较方便。

当判断的逻辑中只是用文件名并且获取的结果是File对象时,那么使用第二个方法比较方便。

当判断的逻辑中只使用文件名并且获取的结果想要是文件名时,使用第三个方法比较方便。

在main()方法中,定义了FilenameFileter文件过滤器对象filter,并且实现了accept()方法,在accept()方法中对currFile对象进行判断,只有当currFile对象代表文件,滨且扩展名为:“.txt”时,才返回true。在new File(“D:\\cn”)对象的list()方法中将filter过滤器对象传入,就得到存储所有“.txt”文件名字的字符串数组。

 
7.2.3 删除文件及目录

delete()方法,但它只是删除一个指定的文件,若File对象代表目录,并且目录下包含子目录或者文件,则不允许直接删除,需要采用递归的方式删除。

定义一个deleteDir()方法,接收一个File类型的参数,调用listFiles()方法把这个目录下所有的子目录和文件保存到一个File类型的数组中,然后遍历这个数组,如果是目录就重新调用deleteDir()方法进行递归,如果是文件就直接删除,当删除完这个目录下的所有文件后,在删除当前这个目录,这样便从里层到外层的删除了整个目录。

注意:

目录符号也可以用正斜线“/”或者File的静态成员变量File.separator表示。

 

7.3 字节流

File类只提供了管理文件和目录的方法,却无法对文件的内容进行操作,如果想要对文件的内容进行操作,就需要通过IO流来完成。 


7.3.1 字节流的概念

IO流中针对字节的输入输出提供了一系列的流,称为字节流。

字节流是程序中最常用的流,在JDK中提供了两个抽象类InputStream(输入管道)和OutputStream(输出管道),他们是字节流的顶级父类(抽象类)。


7.3.2 字节流读写文件

操作文件中的数据是一种常见操作,其中包括从文件中读取数据和将数据写入文件,这类操作被称为文件的读写。针对文件的读写操作,JDK中专门提供了两个类,分别是FileInputStream和FileOutputStream。

FileInputStream是InputStream的子类,它是一个操作文件的字节输入流,专门用于读取文件中的数据。由于文件读取数据是重复的操作,所以一般都是通过一个循环语句来实现数据的持续读取。

注意:

创建流对象后,每次都需要使用close()方法,因为流其实是操作系统产生的一种资源,当在程序中创建一个流对象的同时,系统也会创建一个流对象,这时,计算机中的内存实际上产生了两个事物,一个是Java程序中流的实例对象,一个是系统本身产生的流资源,当对象在没有引用变量指向时会变成垃圾,而Java垃圾回收器只管理程序中类的实例对象,没办法去管理系统产生的资源,所以需要调用close()方法通知系统释放其自身产生的资源。 


7.3.3 文件的拷贝

创建FileInputStream对象读取文件时,必须保证文件存在,否则将抛出文件找不到异常FileNotFoundException。

创建FileInputStream对象时,如果输出的目标文件不存在,程序会创建一个文件,如果文件已存在,这个文件的内容将会被清空。若希望已存在的文件内容之后追加新内容,可使用FileInputStream的构造函数FileInputStream(String filename , Boolean append)来创建文件输出流对象,并把append参数的值设置为true。

在IO流的创建和读写过程中都会遇到异常,为了代码的简洁,都会在方法上用throws关键字把异常抛出。但是在实际开发中需要用到try……catch语句把这些异常进行处理,而且一旦遇到IO异常,IO流的close()方法将无法得到执行,就不能释放流对象占用的系统资源,因此在关闭流的代码常写在finally代码块中,保证IO流的close()方法必须执行。

 
7.3.4 字节流的缓冲区

将读取的数据缓存起来,然后将这些缓冲区的数据一次写入文件。

flush()刷新缓冲区,涮完之后还能写。

close()是关闭资源,在关闭之前会刷新缓冲区,关闭之后就不能再写了。

平时可以不写flush()但是一定要写close();

 
7.2.5 装饰设计模式

装饰设计模式特点:

1.   装饰对象和被装饰对象有相同的接口或者抽象父类

2.   装饰对象包含一个被装饰对象的引用

3.   对于需要包装的方法,在包装对象实现功能的基础上增加功能,对于不想被包装的方法,在实现时利用被包装的对象实现即可(直接调用被包装的对象的方法)。

说白了,装饰设计模式就是对被装饰对象的一种增强,因为共同实现了一个接口,而且被装饰的对象就是装饰模式类的构造函数,装饰就是将接口的方法重写,除了调用被装饰对象的方法内容外还书写了自己的方法内容。

其实,BufferedReader和BufferedWriter就是Reader和Writer的装饰类,给被装饰的Reader和Writer提供缓冲的功能。

 
7.2.6 包装流

在JDK中,很对操作IO流的类使用了装饰设计模式

BufferedInputStream和BufferedOutputStream就在其中。

BufferedInputStream和BufferedOutputStream是带缓冲区的字节输入和输出流,

他们的构造方法中分别接收了一个FileInputSteam和FileOutputSteam类型的参数,为FileInputSteam和FileOutputSteam在读写文件时提供缓冲功能。这种通过对一个已经存在的流进行包装来实现数据读写功能的流称为包装流,使用“流“操作数据时,通常利用包装流特定的增前功能来执行数据的读写。 

源设备 –>字节流–>包装流–>应用程序–>包装流–>字节流–>目标设备

  
7.2.7 字节流继承体系

黑马程序员 第八篇:IO - jeffsong0919 - 小宋的博客

 
7.4 字符流
7.3.1 字符流定义及基本用法

InputStream和OutputStream作为字节流只能针对字节数据进行处理,在应用程序中需要处理文本文件,文本文件中都是字符,为了方便操作,IO提供了Reader类和Writer类。

而在字符流中有一种带缓冲的字符流:BufferedReader和BufferedWriter。

BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区,然后逐个返回给程序, 降低读取文件的次数,提高效率;

BufferedWriter的write()方法写出字符时会先写到缓冲区,缓冲区写满时才会写到文件,降低写文件的次数,提高效率。

 
7.3.2 转换流

字节流和字符流之间的转换,JDK中提供了两个类可以将字节流转换为字符流,分别是:InputStreamReader和OutputStreamReader。  

InputStreamReader的构造方法:

 

黑马程序员 第八篇:IO - jeffsong0919 - 小宋的博客

 

OutputStreamReader的构造方法:

黑马程序员 第八篇:IO - jeffsong0919 - 小宋的博客

0 0