版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章Java中的文件操作《Java面向对象程序设计案例教程(第2版)》目录/Contents9.19.29.3I/O概述文件管理文件字节流9.4
文件字符流9.5
文件处理思政要点/Point数据安全
在文件操作中保护数据安全和个人隐私的重要性,遵守相关法律法规资源节约
在文件操作中合理利用系统资源,减少不必要的磁盘读写,提高程序效率的环保意识。代码规范
遵循良好的代码规范和编写详细文档,确保代码的可读性和可维护性。版权意识
在文件操作中遵守版权法和知识产权法,合法使用第三方库和开源软件I/O概述9.1
在Java中,把所有的输入和输出都当作流(stream)来处理。流是按一定的顺序排列的数据集合。例如,从键盘或文件输入的数据,向显示器或者文件输出的数据等都可以看作是一个个的数据流。输入数据时,一个程序打开数据源上的一个流(文件或内存等),然后按照顺序输入这个流中的数据,这样的流称为输入流,如图9-1上部分所示。输出数据时,一个程序可以打开一个目的地的流(如文件或内存等),然后按顺序向这个目的地输出数据,这样的流称为输出流,如图9-1下部分所示。9.1.1输入/输出流图9-1输入与输出流
输入输出流的方向还可以这样理解,他们是以内存为基准的。数据向内存中写入,称为输入流。数据由内存向外输出,称为输出流。因此,我们把数据流向内存的动作称为读取(read),而把从内存流向外设的操作称为写入(write)。
计算机中常见的输入操作有:键盘输入、光盘读取、摄像头拍摄、扫描仪扫描文件、录音等等。常见的输出操作有:扬声器发声、显示器播放影片、光盘刻录、打印机打印输出等等。正确地判断输入与输出对于程序设计过程中所用的类和方法的选择至关重要。
输入/输出流根据处理数据的类型不同,可分为两类:一类是字节流,另一类是字符流。字节流表示按照字节的形式读写数据,字符流表示按照字符的形式读写数据。9.1.1输入/输出流
字节是现代计算机中数据的最基本存储单位和传输单位,字节流可以理解为在设备与内存的管道中,数据以一小组的0和1的形式顺序排列并流动。如图9-2所示,箭头所示管道中传输的是以两组8位二进制方式编码的数字97和98,一共两个字节。9.1.2字节流图9-2字节流示意图
InputStream类的主要派生子类包括:FileInputStream(按字节读取文件中的数据)、BufferedInputStream(按字节形式读取数据并保存进入缓冲区)等,其层次结构如图9-3所示。9.1.2字节流图9-3InputStream类派生结构图
(1) publicabstractintread()throwsIOException:每次执行方法时,顺序读取字节输入流中的第一个字节,并以int型返回,如果输入流中没有可读取的字节,则返回 -1。这种方法是最基本的读取方法,效率比较低。
(2) publicintread(byteb[])throwsIOException:每次执行方法前,需要预先声明并初始化byte型数组b,初始化长度应该以2的N次方较为合适。方法执行时,从输入流中顺序读取数组b默认长度个数的字节存入数组b中,返回值为当次读取到的字节个数,如果输入流中没有可读取的字节,则返回 -1。与上一种方法相比,效率有所提高,但存在数组b默认长度不好确定的弊端。
(3) publicintread(byteb[],intoff,intlen)throwsIOException:每次执行方法前,同样需要预先声明并初始化byte型数组b,初始化长度应该以2的N次方较为合适。方法执行时,从输入流中顺序读取len-off个字节,依次存入数组b的第off下标开始的位置上,返回值为当次读取到的字节个数,如果输入流中没有可读取的字节,则返回 -1。与上一种方法相比,灵活度最高,效率也有很大提高。9.1.2字节流读取方法
OutputStream类的主要派生子类包括:FileOutoutStream(按字节读取文件中的数据)、BufferedOutoutStream(按字节形式读取数据并保存进入缓冲区)等,其层次结构如图9-4所示。9.1.2字节流图9-4OutputStream类派生结构图
(1) publicabstractvoidwrite(intb)throwsIOException:每次执行方法时,将参数b以字节形式写入输出流中,由输出流顺序流向目的地。
(2) publicvoidwrite(byteb[])throwsIOException:每次执行方法时,将参数数组b中的元素,顺序写入输出流中,由输出流顺序流向目的地。实际应用中,这个方法经常需要配合String类的getBytes方法使用。
(3) publicvoidwrite(byteb[],intoff,intlen)throwsIOException:每次执行方法时,将数组b中,从第off下标开始,累计len长度为止的元素,写入输出流中,由输出流顺序流向目的地。实际应用中,多数与InputStream的第3个read方法联合使用。9.1.2字节流写入方法
字符是现代计算机中字母、符号和数字的集合。字符流可以理解为在设备与内存的管道中,数据以单个字符的形式顺序排列并流动。如图9-5所示,箭头所示管道中传输的是以字符方式编码的小写英文字母a和b,一共两个字符。9.1.3字符流图9-5字符流
在Java语言中,字符流相关类的表示形式多数以Reader或者Writer结尾表示,我们常用抽象类Reader和Writer及其派生子类来处理字符流的输入输出。
字符输入流类Reader用于以字符形式,从数据源中读取数据,其主要派生子类包括InputStreamReader(读取字节数据并将其解码为字符)、FileReader(用于读取字符文件的内容)、BufferedReader(从字符出入流中读取文本字符,缓冲个个字符,从而实现字符、数组和行的高效读取)等。其层次结构如图9-6所示。9.1.3字符流图9-5字符流
(1) publicintread()throwsIOException:每次执行方法时,从输入流中顺序读取一个字符,返回值为该字符的Unicode码值,如果读取结束或没有读取到字符,返回值为 -1。
(2) publicintread(charcbuff[])throwsIOException:每次执行方法前,需要预先声明并初始化char型数组cbuff,初始化长度应该以2的N次方较为合适,方法执行时,从输入流中顺序读取cbuff数组长度个字符,按照下标顺序存放到cbuff数组中,返回值为当次读取到的字符个数,如果读取结束或没有读取到字符,返回值为 -1。
(3) abstractpublicintread(charcbuff[],intoff,intlen)throwsIOException:每次执行方法前,需要预先声明并初始化char型数组cbuff,初始化长度应该以2的N次方较为合适,方法执行时,从输入流中,顺序读取len-off个长度的字符,顺次存放于cbuff数组的第off下标开始的位置上,返回值为当次读取到的字符个数,如果读取结束或没有读取到字符,返回值为-1。9.1.3字符流读取方法
字符输出流Writer用于以字符的形式将数据写入目的地。Writer类是所有字符输出流的父类,其主要派生子类包括OutputStreamWriter(将字符以字节形式写入输出流)、FileWriter(将字符数据写入文件)、BufferedWriter(将字符数据写入缓冲区)、PrintWriter(格式化输出字符数据)等子类。其层次结构如图9-7所示。9.1.3字符流图9-7Writer类派生结构图
1. publicvoidwrite(Stringstr)throwsIOException:每次执行方法时,将指定字符串直接写入输出流。2.publicvoidwrite(Stringstr,intoff,intlen)throwsIOException:每次执行方法时,将执行字符串从第off位置起,长度为len的字符串写入到输出流。经过上面内容的对比,我们不难发现,无论是字节流还是字符流,无论是输入操作还是输出操作,其操作方式基本上可以归纳为如下步骤:1.分清方向,找准目标,决定读取操作还是写入操作。2.根据读写的目标,确定所用的类。3.根据所选择的类,结合计算机内存和Java虚拟机内存的可用情况,在逐个读写、整体一次性读写或小范围多次读写之间选择合适的读写方法重载。4.根据读取方法返回值为-1的情况,决定操作何时停止。9.1.3字符流典型方法
Java的输入输出流之间可以通过套用,提高读写的效率,以输入流的套用方式为例,参看图9-7来形成I/O流套用的初步印象,具体代码操作在后续章节中会详细介绍。9.1.3字符流图9-8字节输入流与字符输入流套用示意图文件管理9.2
广义的“文件”指公文书信或指有关政策、理论等方面的文章。文件的范畴很广泛,电脑上运行的如杀毒、游戏等软件或程序都可以叫文件。计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。在不同的操作系统中,计算机文件的范围所指也有不同。例如,微软的Windows系统中,文件特指单独意义上的单体文件,而文件目录也就是文件夹另外的叫法,而在Linux/UNIX系统中,单体文件和文件夹(包括目录、软连接、硬连接等)都被统一地认为是文件,嵌入式操作系统中,大部分的硬件的I/O端口同样也被认为是文件。
Java语言作为可以跨平台运行的语言,必须全面考虑到各操作系统平台对于文件的操作。因此,在Java语言中,文件、文件夹、软连接、硬连接、快捷方式、硬件I/O端口都按照文件统一对待。本书中以Windows平台为例。9.2.1文件的概念
在Java中,File类既可以表示文件,又可以表示文件夹(目录),其位于java.io包下。Java中用于输入输出操作的类基本都位于这个包下。一个File类型的对象可以表示Java语言中的一个文件或文件夹。1.构造方法(1) File(Stringpathname):通过给定路径创建一个新的File类对象。(2) File(Stringparent,Stringchild):通过给定的文件夹目录和文件名创建一个新的File类对象。(3) File(Fileparent,Stringchild):通过给定的文件对象和文件名创建一个新的File类对象。2.路径(1)相对路径:指由这个文件或文件夹所在的路径引起的跟其他文件或文件夹的路径关系。(2)绝对路径:指目录下的绝对位置,通常是从盘符开始的路径。完整地描述文件位置的路径就是绝对路径,绝对路径名的指定是从树型目录结构顶部的根目录开始到某个目录或文件的路径,由一系列连续的目录组成,中间用斜线分隔,直到要指定的目录或文件,路径中的最后一个名称即为要指向的目录或文件。之所以称为绝对,意指当任何文件需要引用同一个文件时,所使用的路径都是一样的。9.2.2File类(1) publicStringgetName():返回文件对象的XXXXXXX。(2) publicStringgetPath():返回文件对象所在路径名。(3) publicStringgetAbsolutePath():返回文件对象的绝对路径名。(4) publicStringgetParent():返回文件对象所在父目录路径。如果文件对象没有父目录,则返回null。(5) publicbooleanexists():判断文件对象所表示的文件或文件夹是否存在,存在返回true,不存在返回false。(6)publicbooleanisDirectory():判断文件对象所表示的是否为目录(文件夹),如果是返回true,否则返回false。(7) publicbooleanisFile():判断文件对象所表示的是否为一个标准文件,如果是返回true,否则返回false。9.2.3File类的常用方法(8) publicbooleanisHidden():判断文件对象是否是一个隐藏文件,如果是返回true,否则返回false。文件属性可以通过鼠标右击文件查看。(9) publicbooleancreateNewFile():当且仅当文件对象所代表的标准文件不存在时,创建一个空文件,如果创建成功返回true,否则返回false。(10) publicbooleanmkdir():创建文件对象所指向的文件夹,如果路径中包含多层文件夹,必须保证所有路径都是正确的。如果创建成功返回true,否则返回false。(11) publicbooleandelete():删除文件对象所对应的文件或目录,如果文件对象代表的是一个目录,则目录必须是空的才能删除。在Linux系统下,必须保证对当前文件或文件夹有删除权限才能执行。如果删除成功返回true,否则返回false。(12) publicString[]list():列出此文件对象中所包含的文件或文件夹列表,如果文件对象表示一个独立文件,则返回null。9.2.3File类的常用方法文件字节流9.39.3文件字节流
在程序运行过程中,经常需要从文件中读取、写入数据。在Java中,系统提供了FileInputStream和FileOutputStream类,以字节形式从文件中读取和写入数据。文件字节输入/输出流实现了对文件的顺序访问,并且以字节为单位进行读/写操作。在Java中,对文件的读/写操作主要步骤是:1.创建文件输入/输出流对象,此时文件自动打开或创建。2.用文件读写方法读写数据。关闭数据流,同时关闭文件。9.3.1FileInputStream类FileInputStream类的构造方法如下:1. FileInputStream(Stringfilename)。2.FileInputStream(Filefile)。其中,filename表示要打开的文件名,file对象表示要打开的文件对象。FileInputStreamins=newFileInputStream("d:/test.txt");如果d盘下的test.txt文件不存在或没有权限访问,系统会抛出FileNotFoundException异常。9.3.2FileOutputStream类FileOutputStream类的构造方法如下:1.FileOutputStream(Stringfilename)。2.FileOutputStream(Filefile)。3. FileOutputStream(Stringfilename,booleanboo)。4.FileOutputStream(Filefile,booleanboo)。其中filename参数和file参数的含义与FileInputStream相同。其中boolean型参数boo表示是否可以向文件中追加写入字节,默认值为false。如果boo的值为true,则每次写入内容会自动追加在文件中已有内容之后,否则将从文件开头开始写入,文件原有内容将被清空。文件字符流9.49.4.1文件字符流在Java中,系统提供了FileReader和FileWriter类,以字符形式从文件中读取和写入数据。文件字符输入/输出流实现了对文件的顺序访问,并且以字符为单位进行读/写操作。在Java中,对文件的读/写操作主要步骤是:1.创建文件输入/输出流对象,此时文件自动打开或创建。2.用文件读写方法读写数据。3.关闭数据流,同时关闭文件。文件字符流和文件字节流在使用上区别并不大,主要是根据实际情况选用。9.4.1FileReader类FileReader类的构造方法如下:1. FileReader(Stringfilename)。2.FileReader(Filefile)。其中,filename表示要打开的文件名,file对象表示要打开的文件对象。FileReaderinr=newFileReader("d:/test.txt");如果d盘下的test.txt文件不存在或没有权限访问,系统会抛出FileNotFoundException异常。其read方法针对字符操作,与文件字节输入流没有太大区别。实际使用中,FileReader多与BufferedReader联合使用,更加高效地读取字符文件,下面用一些文字来介绍BufferedReader类。9.4.2FileWriter类FileWriter类的构造方法如下:1.FileWriter(Stringfilename)。2. FileWriter(Filefile)。3. FileWriter(Stringfilename,booleanboo)。4. FileWriter(Filefile,booleanboo)。FileWriterfr=newFileWriter("d:/test.txt",true);FileWriter的构造方法还可以创建目标文件,代码执行过后,在d盘下,就会出现名为test.txt的独立文件,fr对象可以以追加的方法向文件中写入内容。FileWriter同样可以与BufferedWriter类联合使用,提高写入效率。文件处理9.59.5.1顺序访问文件虽然读取或者写入文件的形式各有不同,但都遵循了一个原则,就是无论读写,都要按照文件中内容排列的先后顺序进行。无论本次读取或写入一个字节,还是多个字节,一个字符或者多个字符,下一次读取或写入都要从上一次读取或写入的位置继续进行,不允许在文件中任意指定位置进行操作。这也是流(Stream)的概念的体现。9.5.2随机访问文件在实际应用中,Java语言还提供了一种可以更加快速读写文件的方式,就是使用RandomAccessFIle类随机读写文件。这个类提供了随机访问文件的方法,与之前的输入/输出流类相比,有两点不同:1. RandomAccessFile类直接继承了对象类Object,同时实现了DataInput接口和DataOutput接口,所以RandomAccessFile类既可以作为输入流、又可以作为输出流。 RandomAccessFile类之所以允许随机访问文件,是由于它定义了一个文档当前位置的指针,文件的存取都是从文件当前位置指针指示的位置开始的。通过移动
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 26067-2010硅片切口尺寸测试方法》
- 深度解析(2026)《GBT 26012-2010电容器用钽丝》
- 深度解析(2026)《GBT 25952-2010散装浮选镍精矿取样、制样方法》(2026年)深度解析
- 深度解析(2026)《GBT 25915.4-2010洁净室及相关受控环境 第4部分:设计、建造、启动》
- 2025江苏苏州市公交集团有限公司管理岗位(应届生)招聘7人模拟笔试试题及答案解析
- 2026广东省气象部门气象类高校毕业生招聘5人(广州专场)参考笔试题库附答案解析
- 2025广西国土规划集团西藏办事处招聘备考考试题库及答案解析
- 深度解析(2026)《GBT 25631-2010机械振动 手持式和手导式机械 振动评价规则》(2026年)深度解析
- 高中阶段学校多样化发展的制度瓶颈-基于《高中阶段教育普及攻坚计划》后续评估
- 中船集团第七〇八研究所2026届校园招聘备考考试试题及答案解析
- 工业传感器精度提升研发及电子制造应用项目阶段性推进成效及策略
- 2026中国人民银行直属事业单位招聘60人笔试备考试卷带答案解析
- 管理金字塔游戏
- 培训机构课程顾问述职报告
- 桥梁拆除机械破碎施工方案
- 2025年中药资源考试试题及答案
- 2025年青海省西宁市城区中考英语试卷
- 2025秋期版国开电大专科《个人与团队管理》机考真题(第二套)
- 卫生器材与装备操作使用试题和答案
- 2026中水淮河规划设计研究有限公司新员工招聘笔试考试参考题库及答案解析
- DBJ50-T-516-2025 危险性较大的分部分项工程安全管理标准
评论
0/150
提交评论