




免费预览已结束,剩余58页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java275 文件与流,东软it人才实训中心,课程结构,课程结构(续),第十三章 文件与流,学时:5学时 教学方法:讲授ppt上机练习,目标: java文件管理及file类的使用。流的概念及api。字节流与字符流的使用。标准i/o设备操作。,文件与输入/输出处理,学习目标: 文件的操作 文件的输入输出 java.io包的使用,文件与输入/输出处理,1.java.io包简介 要在java程序中处理输入输出的动作,就必须先认识java.io包。 io是input/output的缩写,顾名思义,除了标准输入输出外,其他所有输入输出的动作,都必须依靠这个包中的类来完成,所以我们就先来认识一下这个包,了解一下java对输出入处理的架构!,文件与输入/输出处理,stream “stream”,中文翻译为”流”。 在java.io包中就是以这样的概念来处理数据的输入输出的,”inputstream”和”outputstream”是所有输出入相关类的父类。 在java中对于stream还有额外的定义,就是stream对于数据的传送是以”byte”为单位的,可是有时候我们需要以字符(character)为单位来传送数据,这时就要改用”reader”和”writer”这两个类或其他类,来处理字符的数据。,文件与输入/输出处理,所以java.io包中有两大继承体系: 一个是以byte处理为主的stream类,他们的命名方式都是以xxxxstream; 另一个继承体系是以字符处理为主的reader/writer类,他们的命名方式都是以xxxxreader或xxxxwriter。 inputstream,outputstream,reader,writer这四个类,正是这两大继承体系的父类。,文件与输入/输出处理,node node称为节点,一个流会有一个节点。 如果这个流是数据输入用的,则这个流的一端为数据源(source)的节点,另一端就是程序中处理的程序代码; 如果这个流是数据输出用的,则这个流的一端为程序中处理的程序代码,另一端为数据目的地(sink)的节点。,文件与输入/输出处理,流与节点示意图,数据输入流,数据输出流,数据来源(source),程序,数据目的地(sink),程序,文件与输入/输出处理,在java.io包中: 字节继承体系有三种节点类; 而字符继承体系有四种节点类。 注: 这些节点类跟数据源或数据目的地做直接连接用的,包中其他类没有这种功能。 简单说,节点类是第一线的类,所有输入输出的动作都必须依靠它们来完成,至于其他的类则看程序需要了。,文件与输入/输出处理,节点类,文件与输入/输出处理,方法使用 1.inputstream类 inputstream是输入字节数据用的类。 int read() 这个方法没有参数,一次读取一个byte的数据,并以int类型把数据返回来,如果没有数据可以读了,会返回”-1”。 int read(byte b) 这个方法有一个byte数据类型的参数,这个方法会把所读取到的数据放在这个byte数组中,返回一个int型的数据,这个int型数据存储了返回的真正读取到的数据byte数; int read(byte b, int off, int len) 将输入流中最多 len 个数据字节读入字节,返回值同上,文件与输入/输出处理,void close() 关闭此输入流并释放与该流关联的所有系统资源。 int available() 获取这个流中还有多少个byte的数据可以读取。返回值告诉我们还有多少个byte的数据可以读取。 注:这个方法会产生ioexception异常,另外如果inputstream对象调用这个方法的话,它只会返回0,这个方法必须由继承inputstream类的子类对象调用才有作用。 long skip(long n) 跳过和放弃此输入流中的 n 个数据字节。返回值返回真正跳过的字节数。,文件与输入/输出处理,void mark(int readlimit) 在此输入流中标记当前的位置。 注:mark方法对于inputstream对象也没有什么作用,只有子类才能正常地调用它。 void reset() 将此流重新定位到对此输入流最后调用 mark 方法时的位置。 boolean marksupported() mark和reset方法并不是每种inputstream都能够使用,所以用marksupported方法测试此输入流是否支持 mark 和 reset 方法。,文件与输入/输出处理,2.outputstream outputstream是输出字节数据用的类。 void write(byte b) 将要输出的数组先放在一个byte数组中,然后用这个方法一次把一组数据输出出去。 void write(byte b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。 void write(int b) 将要输出的byte数据传给这个方法就可。,文件与输入/输出处理,注: 使用write方法输出数据时,有些数据并不会马上输出到我们指定的目的,通常会在内存中有个暂存区,有些输出的数据会暂时存放在这里,如果我们想要立刻把数据输出到目的地,不要放在暂存区中时,可以调用”flush”这个方法来对暂存区做清除的动作。 同样,数据输出完后,记得把它”close”,在调用close这个方法时,会先调用flush这个方法,以确保所有的数据都已经输出到目的地了。,文件与输入/输出处理,void close() 关闭此输出流并释放与此流有关的所有系统资源。 void flush() 刷新此输出流并强制写出所有缓冲的输出字节。,文件与输入/输出处理,3.reader reader是输入字符数据用的类,它所提供的方法和inputstream类一样,差别在于inputstream类中用的是byte类型,而reader类中用的是char类型。 注: reader类中没有available方法,取而代之的是”ready”方法,这个方法会去检查reader对象是否已经准备好输入数据了,如果是返回true,反之返回false。,文件与输入/输出处理,4.writer writer类是输出字符数据的类,同样地,提供的方法和outputstream类中的方法类似,将outputstream类中用到的byte类型,换成char类型就可。 注: writer类另外提供了两个writer方法,所以writer类有5个writer方法,多出来的两个只是把char数据换成string对象而已,方便输出字符的数据。,文件与输入/输出处理,文件处理 两部分: 1.文件的操作 2.文件的访问,文件与输入/输出处理,1.文件的操作 这里的文件操作针对的是文件或是目录的管理,并没有访问动作;而操作指的是取得一些文件的信息,文件的检查,文件的删除等。,文件与输入/输出处理,a.构造file对象 file类构造函数: file(string pathname) 通过将给定路径名字符串转换成抽象路径名来创建一个新 file 实例。 例: file f1 = new file(“c:tempabc.txt”); file f2 = new file(“abc.txt”); 注: 字符串中使用”符号,因为”符号属于转义字符,所以在字符串中要使用真正的”符号,需要连续输入两个”。,文件与输入/输出处理,注: 上例中”是windows系统中才有的目录分隔符,在linux系统中目录分隔符是”/”. java的程序最重要的特色是跨平台,所以如果上例的话只能在windows系统下执行了。,文件与输入/输出处理,使用system类中的方法来取得系统参数: system.getproperty(“”); 取得当前系统名称; system.getproperty(“user.dir”); 取得程序现在执行的目录;,文件与输入/输出处理,通过file类提供的常量来取得目录的分隔符号: static string pathseparator 与系统有关的路径分隔符字符,出于方便考虑,它被表示为一个字符串。 static char pathseparatorchar 与系统有关的默认路径分隔符字符。 static string separator 与系统有关的默认目录分隔符,出于方便考虑,它被表示为一个字符串。 static char separatorchar 与系统有关的默认目录分隔符。,文件与输入/输出处理,file类的另外两个构造函数: file(string parent, string child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 file 实例。 例:file f3 = new file(“c:temp”); file(file parent, string child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 file 实例 例:file f4 = new file(f3,”abc.txt”);,文件与输入/输出处理,file对象的使用 file对象的方法有几十个,有的是针对文件的处理,有的是针对目录的处理,当然也有些方法是公用的,包括下面方法:,文件与输入/输出处理,boolean canread() 测试应用程序是否可以读取此抽象路径名表示的文件。 boolean canwrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 int compareto(file pathname) 按字母顺序比较两个抽象路径名。 boolean createnewfile() 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。,文件与输入/输出处理,static file createtempfile(string prefix, string suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 static file createtempfile(string prefix, string suffix, file directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。,文件与输入/输出处理,boolean delete() 删除此抽象路径名表示的文件或目录。 void deleteonexit() 在整个程序结束时,请求删除此抽象路径名表示的文件或目录。 booleanexists() 测试此抽象路径名表示的文件或目录是否存在。 string getabsolutepath() 返回抽象路径名的绝对路径名字符串。,文件与输入/输出处理,string getname() 返回由此抽象路径名表示的文件或目录的名称,不包括路径名称。 string getparent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null。 string getpath() 将此抽象路径名转换为一个路径名字符串。,文件与输入/输出处理,boolean isabsolute() 测试此抽象路径名是否为绝对路径名 boolean isdirectory() 测试此抽象路径名表示的文件是否是一个目录。 boolean isfile() 测试此抽象路径名表示的文件是否是一个标准文件 boolean ishidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。,文件与输入/输出处理,long lastmodified() 返回此抽象路径名表示的文件最后一次被修改的时间。 long length() 返回由此抽象路径名表示的文件的大小,以byte为单位。 string list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。,文件与输入/输出处理,file listfiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。 static file listroots() 列出可用的文件系统根目录。 boolean mkdir() 创建此抽象路径名指定的目录。 booleanmkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。,文件与输入/输出处理,boolean renameto(file dest) 重新命名此抽象路径名表示的文件。 boolean setlastmodified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。 boolean setreadonly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。,文件与输入/输出处理,利用上面方法,做一个类似于unix系统中ls命令的例子: 示例:275-13-1,文件与输入/输出处理,2、文件的访问 了解了流操作的方法和file类的使用后,我们来看看如何访问一个文件中的数据。 两种方式: 一种: 利用fileinputstream,fileoutputstream,filereader,和filewriter这四个节点类。 二种: 利用另外一个特殊类,名叫”randomaccessfile”类来做更进一步数据的访问。,文件与输入/输出处理,a.fileinputstream 两种方式产生fileinputstream对象: 一种: 产生一个file对象,然后当作fileinputstream类构造函数的参数; 二种: 直接给构造函数一个字符串,也就是文件的名称。,文件与输入/输出处理,例: file f = new file(“c:tempabc.txt”); fileinputstream fin = new fileinputstream(f); 或 fileinputstream fin = new fileinputstream(“c:tempabc.txt”); 有了fileinputstream对象之后,然后就是利用之前的read方法从文件中读取数据。 因为fileinputstream类直接继承于inputstream,所以可以使用inputstream类中的方法。,文件与输入/输出处理,例: 利用fileinpuststream结合read方法编写一个类似unix系统中cat指令的例子: 如下:275-1301-2,文件与输入/输出处理,注: 上面几个例子中,有的例子对于中文显示出来的都是乱码,是因为一个中文字需要用两个byte来存放,而read方法每次都只读取一个byte,那么对一个byte的数据进行char类型的强制转换,就会成为乱码了!,文件与输入/输出处理,b.filereader 要处理文本文件,最好是以字符为单位来访问数据,这样才不会有文字处理上的问题。我们把上面例子改用filereader。 示例:275-1301-3,文件与输入/输出处理,c.fileoutputstream 学会了从文件中读取数据,我们来看如何把数据写入文件中。 fileoutputstream构造函数 fileoutputstream (file file) 创建一个向指定 file 对象表示的文件中写入数据的文件输出流。 fileoutputstream (string name) 创建一个向具有指定名称的文件中写入数据的输出文件流 fileoutputstream (string name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。 第二个参数,true,表示写入的数据会附加到原来文件的后面。,文件与输入/输出处理,示例:写一个简单的记事本程序 275-1301-4,文件与输入/输出处理,注: 上例中仍然可操作中文,还是因为string类提供的方法转换的关系,跟fileoutstream类无关。,文件与输入/输出处理,d.filewriter 上例也可以改成使用filewriter类来做文件写入的动作,因为filewriter提供了直接写入字符串的方法。 示例:275-1301-5,文件与输入/输出处理,数据流连接 只用字节或是字符为单位来对数据做输入输出是不够的,有时候我们需要一行一行的读数据,有时我们需要读取特定格式的数据,因此java提供了这样的机制,能把数据流作连接(chain),让原本没有特殊访问方法的流,通过连接到特殊的流后,变成可以用特定的方法来访问数据。,文件与输入/输出处理,filter流类 负责以上机制的是filter流类,也分成 filterinputstream, filteroutputstream, filterreader和 filterwriter 这四个类,所有的filter流类都是继承自他们。,文件与输入/输出处理,filter流类,文件与输入/输出处理,类虽然多,但常用的只有几个,如暂存类和特定数据类型读取类,比较常用到。 在程序中如何将这些流连接起来,简单的说,就是把某个流的对象,当作另一个流类的构造函数。,文件与输入/输出处理,类 bufferedreader 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 通常,reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 bufferedreader 包装所有其 read() 操作可能开销很高的 reader(如 filereader 和 inputstreamreader)。 例如: bufferedreader in = new bufferedreader(new filereader(“foo.in“); 将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readline() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。 可以对使用 datainputstream 进行按原文输入的程序进行本地化,方法是用合适的 bufferedreader 替换每个 datainputstream。,文件与输入/输出处理,类 bufferedwriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newline() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (n) 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。 通常 writer 将其输出立即发送到基础字符或字节流。除非要求提示输出,否则建议用 bufferedwriter 包装所有其 write() 操作可能开销很高的 writer(如 filewriters 和 outputstreamwriters)。 例如, printwriter out = new printwriter(new bufferedwriter(new filewriter(“foo.out“); 将缓冲 printwriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。,文件与输入/输出处理,类 bufferedinputstream 作为另一种输入流,bufferedinputstream 为添加了功能,即缓冲输入和支持 mark 和 reset 方法的能力。 创建 bufferedinputstream 时即创建了一个内部缓冲区数组。读取或跳过流中的各字节时,必要时可根据所包含的输入流再次填充该内部缓冲区,一次填充多个字节。 mark 操作记录输入流中的某个点,reset 操作导致在从所包含的输入流中获取新的字节前,再次读取自最后一次 mark 操作以来所读取的所有字节。,文件与输入/输出处理,类 bufferedoutputstream 该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入基础输出流中,而不必为每次字节写入调用基础系统。,文件与输入/输出处理,类 randomaccessfile 此类的实例支持对随机存取文件的读取和写入。 随机存取文件的行为类似存储在文件系统中的一个大型字节数组。 存在指向该隐含数组的光标或索引,称为文件指针; 输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。 如果随机存取文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。 写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-湖南-湖南中式烹调师二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北计算机操作员一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北水工监测工一级(高级技师)历年参考题库典型考点含答案解析
- 文化产业园产业集聚与2025年服务体系升级路径研究报告
- 2025年事业单位工勤技能-湖北-湖北收银员二级(技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北地质勘查员五级(初级工)历年参考题库典型考点含答案解析
- 农村金融服务体系与农村金融科技创新趋势研究报告
- 2025年事业单位工勤技能-海南-海南殡葬服务工四级(中级工)历年参考题库含答案解析
- 2025年共享办公工位预订系统市场前景与风险评估报告
- 2025年事业单位工勤技能-浙江-浙江水利机械运行维护工五级(初级工)历年参考题库含答案解析(5套)
- 装修维修协议合同范例
- 初中信息技术课堂中的项目式学习实践研究结题报告
- DB32T-蛋鸡养殖场健康生产规范(报批稿)编制说明
- 停车数据深度挖掘
- 产品研发与技术转移制度
- 八年级语文重点知识及文学常识归纳总结
- 台州市开发投资集团有限公司招聘笔试题库2024
- 乡镇供电所全能型员工评聘考试题库(精简600题)
- 机械设备投标书范本
- 河北安装工程消耗量定额计算规则
- 义务教育《数学课程标准》2022年版原文
评论
0/150
提交评论