Java基础案例教程(第3版) 课件 第7章 IO_第1页
Java基础案例教程(第3版) 课件 第7章 IO_第2页
Java基础案例教程(第3版) 课件 第7章 IO_第3页
Java基础案例教程(第3版) 课件 第7章 IO_第4页
Java基础案例教程(第3版) 课件 第7章 IO_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章I/O《Java基础案例教程》(第3版)学习目标/Target掌握File类的使用方法,能够创建File对象,并能够调用File类的常用方法创建、删除、判断和获取文件,以及对目录进行遍历掌握字节流的使用方法,能够使用字节流读取和写入文件,并能进行I/O流的资源释放掌握字符流的使用方法,能够使用字符流读取和写入文件熟悉I/O流,能够简述I/O流的概念以及I/O流的继承体系学习目标/Target熟悉缓冲流的使用方法,能够使用字符缓冲流和字节缓冲流读写文件熟悉对象流的使用方法,能够使用对象流读取和写入对象类型的数据了解CommonsIO,能够在项目中使用CommonsIO的工具类对文件进行操作熟悉数据流的使用方法,能够使用数据流读取和写入基本数据类型的数据章节概述/

Summary大多数的应用程序都需要与外部设备进行数据交换,例如,从磁盘中读取文件内容、将数据写入磁盘或网络等。Java将这种在应用程序与外部设备之间的数据传输抽象表述为“流”。Java中的“流”都位于java.io包中,称为I/O(输入输出)流。本章将针对I/O流的相关知识进行讲解。目录/Contents0102File类I/O流概述0304字节流字符流目录/Contents0506缓冲流数据流0708对象流CommonsIOFile类7.17.1File类File类是Java中用于对磁盘上的文件和目录的抽象表示形式的类,它位于java.io包中。通过实例化File对象,可以对文件或目录进行一些基本的操作,如创建、删除、重命名、判断是否存在等,下面对File类进行讲解。7.1.1创建File对象

先定一个小目标!掌握创建File对象,能够使用File的构造方法创建File对象7.1.1创建File对象File类提供了多个构造方法用于创建File对象,常见构造方法如下表所示。方法声明功能描述File(Stringpathname)通过指定的字符串类型的文件路径创建File对象File(Stringparent,Stringchild)通过指定的字符串类型的父路径和子路径(包括文件名称)创建File对象File(Fileparent,Stringchild)通过指定的File类的父路径和字符串类型的子路径(包括文件名称)创建File对象7.1.1创建File对象案例演示下面通过一个案例演示如何使用File类提供的构造方法创建一个File对象。Example01.java源代码7.1.1创建File对象案例演示案例的运行结果如下图所示。7.1.2File类的常用方法

先定一个小目标!掌握File类的常用方法,能够使用File类的常用方法判断和获取文件、创建和删除文件、遍历目录7.1.2File类的常用方法1.判断和获取方法在操作文件或目录的过程中,经常需要对文件或目录的信息做判断和获取操作。例如,判断给定路径下是否存在文件或目录、获取文件的名称、大小和路径等信息。这些操作可以通过File类提供的一系列判断和获取方法来实现。7.1.2File类的常用方法1.判断和获取方法File类常见的判断和获取方法。方法声明功能描述booleanexists()判断File对象对应的文件或目录是否存在,若存在则返回true,否则返回falsebooleanisFile()判断File对象对应的是否是文件(不是目录),若是文件则返回true,反之返回falsebooleanisDirectory()判断File对象对应的是否是目录(不是文件),若是目录则返回true,反之返回falsebooleanisAbsolute()判断File对象对应的文件或目录是否是绝对路径booleancanRead()判断File对象对应的文件是否可以读取,若可以则返回true,反之返回falsebooleancanWrite()判断File对象对应的文件是否可以修改,若可以则返回true,反之返回false7.1.2File类的常用方法1.判断和获取方法接上页表格。方法声明功能描述StringgetName()返回File对象表示的文件或目录的名称longlength()返回文件内容的长度(单位是字节)longlastModified()返回1970年1月1日0时0分0秒到文件最后修改时间的毫秒值StringgetPath()返回File对象对应的路径名字符串StringgetAbsolutePath()返回File对象对应的绝对路径(在Unix/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径)StringgetParentFile()返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录)7.1.2File类的常用方法1.判断和获取方法下面通过一个案例演示File类的判断和获取方法的使用。首先在项目的src目录下创建一个名为file的包,然后在file包中创建一个名为example的文本文件,并使用记事本打开后随便添加一些内容并保存。然后编写案例代码。Example02.java源代码7.1.2File类的常用方法1.判断和获取方法案例的运行结果如下图所示。7.1.2File类的常用方法2.创建和删除方法除了判断和获取已存在文件或目录的信息外,File类还提供了用于创建和删除文件或目录的方法。方法声明功能描述booleancreateNewFile()当File对象对应的文件不存在时,该方法将新建一个文件,若创建成功则返回true,否则返回false。booleanmkdir()新建一个目录,若创建成功则返回true,否则返回falsebooleanmkdirs()新建多级目录(包括创建所需但不存在的父目录),若创建成功则返回true,否则返回falsebooleandelete()删除File对象对应的文件或目录(不能删除非空目录),若删除成功则返回true,否则返回false7.1.2File类的常用方法2.创建和删除方法下面通过一个案例演示File类的创建和删除方法的使用。Example03.java源代码7.1.2File类的常用方法2.创建和删除方法案例的运行结果如下图所示。7.1.2File类的常用方法2.创建和删除方法接着进入D盘下的file目录,验证文件和目录的创建结果,如下图所示。7.1.2File类的常用方法3.遍历目录通常目录中可能会包含文件和子目录,此时如果想要获取目录中的所有文件和子目录的信息,就需要对目录进行遍历,File类用于遍历目录的方法如下表所示。方法声明功能描述String[]list()获取当前目录下所有的一级目录名称和文件名称到一个字符串数组中File[]listFiles()获取当前目录下所有的一级目录名称和文件对象到一个文件对象数组中上面表格中两个方法都只能返回当前目录下的一级目录或文件,也就是说,无法直接获取当前目录中子目录的内容。7.1.2File类的常用方法3.遍历目录下面通过一个案例演示File类遍历目录方法的使用。Example04.java源代码7.1.2File类的常用方法3.遍历目录案例的运行结果如下图所示。7.1.2File类的常用方法3.遍历目录为了实现能够获取符合指定条件的文件,File类提供了一个重载的list(FilenameFilterfilter)方法,该方法接收一个FilenameFilter类型的参数,用于过滤文件名。FilenameFilter是一个接口,被称作文件过滤器,其中定义了一个抽象方法accept(Filefile,Stringname),用于依次对指定File的所有子目录或文件进行迭代。7.1.2File类的常用方法3.遍历目录在调用list(FilenameFilterfilter)方法时,需要实现文件过滤器FilenameFilter,并在accept(Filefile,Stringname)方法中进行筛选,从而获得指定条件的文件。list(FilenameFilterfilter)方法的工作原理如下:调用list(FilenameFilterfilter)方法,传入FilenameFilter文件过滤器对象。遍历当前File对象所对应目录的所有子目录和文件。把代表当前目录的File对象和子目录或文件的名称作为参数,调用accept(Filefile,Stringname)方法。如果accept(Filefile,Stringname)方法返回true,就将当前子目录或文件添加入数组,否则不进行添加。7.1.2File类的常用方法3.遍历目录下面通过一个案例演示如何获取指定目录下所有扩展名为“.txt”的文件。Example05.java源代码7.1.2File类的常用方法3.遍历目录案例的运行结果如下图所示。7.1.3递归文件搜索

先定一个小目标!掌握递归文件搜索,能够调用File类的常用方法实现文件的递归搜索7.1.3递归文件搜索7.1.2节中遍历目录时获取的都是当前目录下的文件及子目录。如果想要获取当前目录下子目录中的内容,就可以使用listFiles()方法结合递归的方式进行遍历。具体步骤如下:先调用listFiles()方法,获取当前目录下的一级目录和文件,得到一个数组。遍历数组,获取数组中的File对象。判断File对象的类别。如果当前File对象是文件,则获取文件名或路径并打印;如果File对象是目录,则获取目录名或路径并打印,然后递归执行1、2、3步骤。7.1.3递归文件搜索案例演示下面通过一个案例演示如何使用递归的方式遍历目录下的所有文件及子目录。Example06.java源代码7.1.3递归文件搜索案例演示案例的运行结果如下图所示。【案例7-1】文件搜索与删除工具案例描述在日常工作中,经常需要在大批量的文件中进行搜索、删除等操作。如果手动去管理批量文件,会比较浪费时间,工作量也较大。本案例要求编写一个文件搜索与删除工具,实现对批量文件的搜索与删除。具体要求如下:(1)输入指令1,代表“指定关键字搜索文件”,输入搜索的目录和关键字(多个关键字用逗号分隔),系统在指定的目录下搜索文件名包含关键字的文件,并展示其绝对路径。(2)输入指令2,代表“指定后缀名搜索文件”,输入搜索的目录和关键字,系统在指定的目录下搜索出指定后缀名的所有文件,并展示其绝对路径。【案例7-1】文件搜索与删除工具案例描述(3)用户输入指令3,代表“删除文件/目录”,此时需要用户输入需要删除的文件/目录,程序执行后会将目录以及目录下的内容全部删除。(4)用户输入指令4,代表“退出”,即退出该文件管理器程序。【案例7-1】文件搜索与删除工具案例效果I/O流概述7.27.2I/O流概述熟悉I/O流概述,能够简述I/O流的概念以及简述I/O流的继承体系

先定一个小目标!7.2I/O流概述File类主要用于操作文件的属性和路径,无法直接操作文件中的内容。如果程序需要对文件中的内容进行读取或写入,就需要使用I/O流。I/O流以流的形式进行数据的输入和输出,可以对文件或网络中的数据进行读取和写入操作。7.2I/O流概述Java中的I/O流有很多种,根据数据传输方向的不同,可以分为输入流和输出流;根据操作数据的不同,可以分为字节流和字符流。(1)输入流和输出流。输入流:用于从磁盘、网络等来源将数据读取到程序中。通过输入流,程序可以从文件或者网络中读取数据并在程序中进行处理。输出流:则用于将程序中的数据写入到磁盘、网络等目标位置。通过输出流,程序可以将数据写入到磁盘或者发送到网络中。7.2I/O流概述输入流和输出流的示意图。7.2I/O流概述(2)字节流和字符流。在Java的I/O流中,数据本质上是由一组二进制位构成的序列。为了方便对不同类型的数据进行处理,Java提供了字节流和字符流两种类型的I/O流。字节流:以字节为单位来处理流上的数据。字节流适用于处理二进制数据,如图像、音频等。字符流:以字符为单位来处理流上的数据。字符流适用于处理文本数据,如对文本文件中的内容进行读写。7.2I/O流概述I/O流的继承体系(字节流)。7.2I/O流概述I/O流的继承体系(字符流)。字节流7.37.3字节流在计算机中,无论是文本、图片,还是音频,它们在存储设备中都是由一系列字节组成的。Java中用于处理二进制数据,以字节为基本单位进行读取和写入操作的流称为字节流,本节将对字节流进行讲解。7.3.1InputStream掌握InputStream的使用,能够使用InputStream读取文件

先定一个小目标!7.3.1InputStreamInputStream是Java中所有字节输入流的父类,它提供了一系列方法来读取字节数据,其中常用的方法如下表所示。方法声明功能描述intread()从输入流读取一个字节,把它转换为0~255的整数,并返回这一整数intread(byte[]b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回值为读取到的字节数,如果已到达流的末尾,返回值将为-1intread(byte[]b,intoff,intlen)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始索引,len表示读取的字节数目,返回值为读取到的字节数,如果已到达流的末尾,返回值将为-1voidclose()关闭此输入流并释放与该流关联的所有系统资源7.3.1InputStream使用InputStream类的注意事项:InputStream是一个抽象类,需要通过实例化其子类的对象来使用字节输入流。FileInputStream是InputStream的一个子类,专门用于从文件中读取数据。FileInputStream的构造方法可以接收一个文件名或者一个File对象作为参数,通过这个参数可以指定要读取数据的文件。在创建FileInputStream对象时,如果文件不存在或者无法访问,会抛出FileNotFoundException异常。7.3.1InputStream案例演示下面通过一个案例演示使用FileInputStream读取文件中的数据。首先在Java项目的src目录下创建一个名为file的包,在该包中创建一个文本文件test01.txt,在文件中输入内容“itheima”并保存。最后使用字节输入流对象来读取test01.text文件。Example07.java源代码7.3.1InputStream案例演示案例的运行结果如下图所示。7.3.1InputStream为了提高读取效率,可以使用一次能读取若干字节的read()方法。下面通过一个案例演示一次读取指定长度的数据的方式完成文件的读取。案例演示Example08.java源代码7.3.1InputStream案例的运行结果如下图所示。案例演示7.3.1InputStream脚下留心:中文乱码问题由于一个中文字符在UTF-8编码方案中占3个字节,在读取包含中文的文件时,采用一次读取一个字节或一次读取多个字节都可能因读取不到完整的字符而出现乱码问题。例如,将test01.txt中的内容改为“itheima程序员”,运行Example08,结果如下图所示。7.3.1InputStream脚下留心:中文乱码问题为了避免中文乱码问题,需要调整每次读取的字节数以确保每个字符都能够被完整读取。此外,还可以使用InputStream类提供的readAllBytes()方法,一次性读取文件中的全部字节,并将其转化为字符串输出。例如,将文件Example08.java中的第7~13行代码,修改为如下代码。int[]arr; //声明一个int[]类型的变量arr=newint[3]; //为arr分配3个数组元素的空间7.3.1InputStream脚下留心:中文乱码问题修改完成后再次运行,结果如下图所示。7.3.2OutputStream

先定一个小目标!掌握OutputStream,能够使用OutputStream向文件中写入数据7.3.2OutputStreamOutputStream是Java中所有字节输出流类的父类。OutputStream提供了一些基本的方法来写入字节数据,常用的方法如下表所示。方法声明功能描述voidwrite(intb)向输出流写入一个字节voidwrite(byte[]b)将字节数组b中的所有字节写到输出流voidwrite(byte[]b,intoff,intlen)将byte数组中从偏移量off开始的len个字节写入输出流voidflush()刷新输出流并强制写出所有缓冲的输出字节voidclose()关闭输出流并释放与此流相关的所有系统资源7.3.2OutputStream使用OutputStream类的注意事项:与InputStream类类似,使用OutputStream类时必须先通过子类实例化对象。OutputStream类有多个子类,其中FileOutputStream子类是操作文件的字节输出流。FileOutputStream的构造方法可以接收一个文件名或者一个File对象作为参数,通过这个参数可以指定要写入数据的文件。在创建FileOutputStream对象时,如果文件不存在,则会创建一个新的文件;如果文件已经存在,如果没有指定其他参数,默认会覆盖原有的文件内容。7.3.2OutputStream案例演示下面通过一个案例演示如何使用FileOutputStream将数据写入文件。Example09.java源代码7.3.2OutputStream案例演示运行案例后,会在src\file目录中生成一个新的文本文件test02.txt,打开该文本文件查看文件中的内容,如下图所示。7.3.2OutputStream案例演示如果希望在已存在的文件内容之后追加新内容,则可使用FileOutputStream的构造方法FileOutputStream(Stringfilename,booleanappend)创建文件输出流对象,并把参数append的值设置为true。下面通过一个案例演示在已存在文件的内容后追加内容。Example10.java源代码7.3.2OutputStream案例演示案例的运行结果如下图所示。【案例7-2】音频加密解密案例描述音频文件可以用来存储音乐、语音等。在某些情况下,需要对这些音频文件进行加密,以保护其中的内容不被未授权的人获取。例如,企业的商业机密文件或电话录音的音频文件,希望将其加密后传输。本案例要求编写一个模拟音频加密解密的程序,能够对音频文件进行加密和解密。具体要求如下:进入程序后会显示该程序的三个功能,分别是音频加密、音频解密和退出程序。要求原始音频文件、加密音频文件和解密音频文件分别存储在D:\audio目录下的三个文件夹中。【案例7-2】音频加密解密案例描述选择音频加密功能后,系统会显示原始音频文件目录中可以进行加密的所有文件名称。接着需要用户输入想要加密的文件名称(包括后缀名,本案例要求对mp3格式的音频进行加密),输入完成后对该文件进行加密(加密后的文件后缀仍为“.mp3”,但无法正常打开),完成后提示加密成功的信息和加密后文件的绝对路径。选择音频解密功能后,系统会显示所有已经加密过的音频文件名称。接着需要用户输入需要解密的文件名称,输入完成后对该文件进行解密,完成后提示解密成功和解密后文件的绝对路径。提示:案例要求既要加密又要解密。为了实现这一功能,可以使用异或操作进行加密,因为异或操作具有自反性,即对同一个数值进行两次异或操作得到的还是原值,这样可以简化解密操作。【案例7-2】音频加密解密案例效果字符流7.47.4字符流InputStream类和OutputStream类在读写文件时操作的都是字节,如果需要读写纯文本数据,Java虚拟机需要将字节转换为字符,如果数据规模较大时这个转换过程相对比较耗时,并且字符可以进行编码的类型比较多,有时候不知道编码类型很容易产生乱码。对此,JavaI/O流中提供了字符流,使得直接操作字符变得更加方便。7.4.1Reader掌握Reader的使用,能够使用Reader读取文件中的内容

先定一个小目标!7.4.1ReaderReader是字符输入流的顶级父类,用于从网络或磁盘等数据源中以字符为单位读取数据程序中。Reader类定义了字符输入流的基本共性功能方法,常用方法如下表所示。方法声明功能描述intread()从输入流中读取一个字符,并返回其Unicode,如果到达流的末尾,则返回-1intread(charcbuf[])从输入流中读取若干个字符,并将其存储到指定的字符数组cbuf中,返回值为读取到的字符数,如果已到达流的末尾,则返回-1intread(charcbuf[],intoff,intlen)从输入流中读取若干个字符,并将其存储到指定的字符数组cbuf中;off参数表示从数组的哪个位置开始存储,len参数表示最多读取的字符数。返回值为读取到的字符数,如果到达流的末尾,则返回-1voidclose()用于关闭输入流,释放与之相关的系统资源longtransferTo(Writerout)用于将输入流中的字符数据直接传输到指定的输出流Writer中7.4.1Reader使用Reader类的注意事项:使用Reader类时,需要先使用其子类进行实例化。Reader类有多个子类,其中FileReader子类是用于操作文件的字符输入流,开发者可以使用构造函数FileReader(StringfileName)或FileReader(Filefile)来创建一个FileReader对象,并指定要读取的文件。7.4.1Reader案例演示下面通过一个案例演示如何使用FileReader读取文件中的内容。首先在src目录下的file包中新建一个test04.txt文件,并在其中输入内容“黑马程序员”,然后使用文件字符输入流FileReader对象读取test04.txt文件中的内容。Example11.java源代码7.4.1Reader案例演示案例的运行结果如下图所示。7.4.1Reader案例演示为了提高读取效率,可以使用一次可以读取若干字符的read()方法。下面对Example11.java文件中的读取方式进行改进。Example12.java源代码7.4.1Reader案例演示案例的运行结果如下图所示。7.4.2Writer掌握Writer的使用,能够使用Writer向文件中写入内容

先定一个小目标!7.4.2WriterWriter是字符输出流的顶级父类,用于以字符为单位将数据写入到网络或磁盘等各种目标中。Writer类定义了字符输出流的基本共性功能方法,其中常用的方法如表7-8所示。方法声明功能描述voidwrite(charcbuf[])将字符数组cbuf中的所有字符写入到输出流中voidwrite(charcbuf[],intoff,intlen)将字符数组cbuf中从偏移量off开始的len个字符写入到输出流中voidwrite(Stringstr)将字符串str写入到输出流中voidwirte(Stringstr,intoff,intlen)将字符串str中从偏移量off开始的len个字符写入到输出流中voidflush()强制将缓冲区的数据同步到输出流中voidclose()关闭输出流,释放与之相关的资源7.4.2Writer使用Writer类的注意事项:在使用Writer类时,同样需要通过其子类进行实例化。FileWriter是Writer类的一个子类,用于向文件中以字符为单位写入数据。FileWriter提供了构造函数FileWriter(StringfileName)或FileWriter(Filefile)来创建一个FileWriter对象,并指定要写入的文件。7.4.2Writer案例演示下面通过一个案例演示如何使用FileWriter将数据写入文件中。Example13.java源代码7.4.2Writer案例演示案例的运行结果如下图所示。7.4.2WriterFileWriter同FileOutputStream一样,如果指定的文件不存在,就会先创建文件,再写入数据;如果文件存在,则向文件中写入数据时,会默认覆盖原文件的内容。如果想在原文件末尾追加数据,需要调用如下重载的构造方法创建FileWriter对象。或者FileWriter(Filefile,Booleanappend)FileWriter(Stringfilename,Booleanappend)7.4.2Writer下面,将文件Example13.java中的第5行代码修改为如下代码。Writerwriter=newFileWriter("src\\file\\test05.txt",true);修改完成后,再次运行文件Example13.java,查看test05.txt的内容,如下图所示。7.4.2Writer案例演示在字符输入流和字符输出流中,使用Reader类提供的transferTo()方法,可以更简单直接的将文件中的内容传输到目标文件中。下面通过一个案例演示使用transferTo()方法实现文件复制,将文件test05.txt中的内容复制到文件test05copy.txt中。Example14.java源代码7.4.2Writer案例演示运行文件Example14.java,程序会在src目录下的file目录中新建一个文件test05copy.txt,打开该文件查看复制结果,如下图所示。【案例7-3】日记本案例描述许多人都曾写过日记,用文字留住一些值得记录的事情。本案例要求编写一个模拟日记本的程序,以一个文本文件为一个日记本,支持用户新建日记本,写日记、修改日记、查看日记的操作。具体要求如下:进入程序后会显示该程序的五个功能,分别是新建日记本、写日记、修改日记、查看日记和退出程序。日记本文件的存储目录为“D:\diary”。【案例7-3】日记本案例描述写日记。用户输入选择写日记的日记本名称,若该日记本不存在,提示创建对应名称的日记本;若该日记本存在,且已经有内容,可以让用户选择覆盖原来的内容、追加内容或者取消操作;若该日记本没内容,则直接写入日记。修改日记。用户输入需要修改日记的日记本名称,若该日记本不存在,给出用户提示;若该日记本存在,且已经有内容,则让用户输入修改内容进行修改;若该日记本没内容,则给出用户提示。查看日记。用户输入想要查看的日记。若该日记本不存在,给出用户提示,否则输出该日记本中的内容。缓冲流7.57.5.1缓冲流概述熟悉缓冲流概述,能够简述缓冲流的好处,以及缓冲流读写数据的原理

先定一个小目标!7.5.1缓冲流概述在JavaIO中,每一次读写操作都会涉及到系统资源的调度,包括磁盘的访问和内存的申请等,这些调度都会占用一定时间,当读写量较大时可能会影响程序性能。为此,JavaIO提供了一种缓冲流,它通过在内存中设置一个默认大小的数组作为缓冲区,来提高读写数据的效率。7.5.1缓冲流概述缓冲流提高IO效率的关键在于利用了内存和硬盘读写速度的差异。它通过一次性从硬盘读取较大的数据块到内存中的缓冲区,使得程序可以从缓冲区中读取数据,减少了对硬盘的频繁访问,从而提升了IO操作的效率。缓冲流读写数据的原理如下图所示。7.5.1缓冲流概述需要说明的是,缓冲流是对原始流(字节流和字符流)的增强,它属于处理流,需要套接在原始流之上。也就是说,缓冲流需要依赖于原始流进行使用。JavaIO中提供了字节缓冲流和字符缓冲流两种缓冲流,使用缓冲流需要及时调用close()方法或flush()方法刷新缓冲区,确保所有数据都被写入或读取。7.5.2字节缓冲流熟悉字节缓冲流,能够使用BufferedInputStream和BufferedOutputStream读写数据

先定一个小目标!7.5.2字节缓冲流字节缓冲流包括字节缓冲输入流BufferedInputStream和字节缓冲输出流BufferedOutputStream。下面讲解这两个流。7.5.2字节缓冲流BufferedInputStream是InputStream的子类,当从BufferedInputStream中读取字节时,BufferedInputStream会从底层输入流中读取一块数据到内部缓冲区,然后根据需要从内部缓冲区中读取数据。BufferedOutputStream是OutputStream的子类,当向BufferedOutputStream中写入字节时,它会先将数据存储在内部缓冲区中,只有当缓冲区满了或调用了flush()、close()方法时,才会将缓冲区中的数据真正写入到底层输出流。7.5.2字节缓冲流由于缓冲流需要依赖于原始流进行使用,所以BufferedInputStream类和BufferedOutputStream类的构造方法分别接收InputStream和OutputStream类型的参数作为被包装对象,从而在读写字节数据时提供缓冲功能。7.5.2字节缓冲流案例演示下面通过一个文件复制的案例来学习BufferedInputStream和BufferedOutputStream这两个流的用法。在src目录下的file目录中新建一个文本文件test06.txt,作为源文件,并向该文件中添加内容“字节缓冲流”。Example15.java源代码7.5.2字节缓冲流案例演示案例的运行结果如下图所示。7.5.3字符缓冲流熟悉字符缓冲流,能够使用BufferedReader和BufferedWriter读写数据

先定一个小目标!7.5.3字符缓冲流字符缓冲流包括字符缓冲输入流BufferedReader和字符缓冲输出流BufferedWriter。下面讲解这两个流。7.5.3字符缓冲流BufferedReader是Reader的子类,当从BufferedReader中读取字符时,BufferedReader会从底层输入流中读取一块数据,然后根据需要从内部缓冲区中提取字符。BufferedReader提供了一个增强方法readLine(),可以更高效的读取数据。BufferedWriter是Writer的子类,当向BufferedWriter中写入字符时,它会先将数据存储在内部缓冲区中,只有当缓冲区满了或调用了flush()方法时,才会将缓冲区中的数据真正写入到底层输出流。7.5.3字符缓冲流案例演示BufferedReader和BufferedWriter的构造方法分别接收Reader和Writer类型的参数作为被包装对象。下面通过一个案例演示使用BufferedReader和BufferedWriter实现文件的复制。在src目录下的file目录中新建一个文本文件test07.txt,作为源文件,并向该文件中添加内容“字符缓冲流”。Example16.java源代码7.5.3字符缓冲流案例演示案例的运行结果如下图所示。【案例7-4】异常签到统计案例描述某公司要求所有员工在每天到岗时需要签到,每天正常签到时间在上午的9点以前,超过9点的签到都视为迟到。为了方便统计员工的签到情况,每天签到的数据会保存在一个文件中,本案例要求编写一个异常签到统计的程序,读取员工的签到数据,并将迟到的签到信息作为异常签到信息存储到另一个文件中。本案例原始签到信息的存储位置为“src\file\sgindata.txt”,异常签到信息的存储位置为“src\file\latedata.txt”。【案例7-4】异常签到统计案例效果数据流7.67.6数据流熟悉数据流的使用,能够使用数据流读取和写入基本数据类型的数据

先定一个小目标!7.6数据流在Java编程中,如果希望将原始数据类型和字符串写入流中,并在读取时根据对应的数据类型进行读取,可以使用JavaI/O提供的数据流。其中,DataInputStream和DataOutputStream是较为常用的数据流,常用于处理基本类型和字符串类型的数据,将这些数据按顺序写入到输出流中,读取时,可以根据相同的顺序读取字节序列,并将其转换成对应的数据类型。7.6数据流DataInputStream类提供了一系列方法,用于读取特定类型的数据,其中常用的方法如下表所示。方法声明功能描述booleanreadBoolean()读取boolean类型的数据并返回bytereadByte()读取byte类型的数据并返回intreadInt()读取int类型的数据并返回doublereadDouble()读取double类型的数据并返回StringreadUTF()读取编码格式为UTF-8的String类型的数据并返回7.6数据流DataOutputStream类提供了一系列方法,用于读取特定类型的数据,其中常用的方法如下表所示。方法声明功能描述voidwriteBoolean(booleanv)将boolean类型的数据写入字节流voidwriteByte(intv)将byte类型的数据写入字节流voidwriteInt(intv)将int类型的数据写入字节流voidwriteDouble(doublev)将double类型的数据写入字节流voidwriteUTF(Stringstr)将字符串数据以UTF-8编码格式写入字节流7.6数据流案例演示下面通过一个案例演示使用DataOutputStream和DataInputStream向文件中写入数据和读取数据。Example17.java源代码7.6数据流案例演示案例的运行结果如下图所示。对象流7.77.7对象流熟悉数据流的使用,能够使用数据流读取和写入基本数据类型的数据

先定一个小目标!7.7对象流随着对象在应用中的广泛使用,有时候需要将对象存储到文件或网络中,同时也要能够将存储的对象重新恢复成原始的对象状态。为了解决这个问题,可以使用对象流。对象流是JavaIOAPI提供的一种高级流,它包括ObjectInputStream和ObjectOutputStream两个类,这两个类分别用于将Java对象写入输出流,以及从输入流中读取Java对象。7.7对象流

对象流在进行对象的写入操作时,需要将Java对象转换成二进制流进行传输,这一过程称为对象的序列化,而在读取对象时,需要再将其反序列化为Java对象。因此,在使用对象流时,被传输的对象的类需要实现Serializable接口。7.7对象流案例演示ObjectInputStream类和ObjectOutputStream类提供的读取对象的方法和写入对象的方法分别为readObject()和writeObject(Objecto)。下面通过一个案例演示如何使用这两个方法读取和写入对象类型的数据。首先定义一个User类,并实现Serializable接口,用于创建被读写的对象。User.java源代码7.7对象流案例演示接着使用ObjectInputStream类和ObjectOutputStream类将User对象写入文件中并读取出来。Example18.java源代码7.7对象流案例演示案例的运行结果如下图所示。CommonsIO7.87.8CommonsIO

先定一个小目标!了解CommonsIO,能够在项目中使用CommonsIO的工具类对文件进行操作7.8CommonsIOCommonsIO是一组用于简化I/O操作的类库,它包含一系列工具类,用于文件、流和目录的操作,旨在提高开发人员在IO功能开发中的效率。其中,常用的工具类有FileUtils和IOUtils,分别用于文件操作和流操作,下面对CommonsIO中的FileUtils和IOUtils进行讲解。7.8CommonsIOFileUtils类提供了一系列操作文件和目录的方法,包括复制、移动、删除、读取、写入等操作。FileUtils类的部分常用方法如下表所示。方法声明功能描述voidcopyFile(FilesrcFile,FiledestFile)将源文件srcFile复制到目标文件destFilevoidcopyDirectory(FilesrcDir,FiledestDir)将源目录srcDir下的所有文件和子目录复制到目标目录destDirvoidcopyFileToDirectory(FilesrcFile,FiledestDir)将源文件srcFile复制到目标目录destDirvoiddeleteDirectory(Filedir)删除指定目录dir的所有内容,包含子目录和文件StringreadFileToString(Filefile,Charsetencoding)将文件file的内容以encoding字符编码读取并返回为字符串voidwriteStringToFile(Filefile,Stringdata,Stringcharname,Charsetencoding,Booleanappend)将字符串data以encoding字符编码写入文件file中,append为true为追加模式,否则为覆盖模式7.8CommonsIOIOUtils类提供了一系列处理I/O流的方法,包括读取、写入、复制、转换等操作。IOUitls类的部分常用方法如下表所示。方法声明功能描述byte[]readBytes(InputStreaminput)将输入流

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论