第8章 、流和输入输出技术.ppt

上传人:s****8 文档编号:66866360 上传时间:2022-12-21 格式:PPT 页数:34 大小:741.50KB
返回 下载 相关 举报
第8章 、流和输入输出技术.ppt_第1页
第1页 / 共34页
第8章 、流和输入输出技术.ppt_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《第8章 、流和输入输出技术.ppt》由会员分享,可在线阅读,更多相关《第8章 、流和输入输出技术.ppt(34页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第8 8章章 文件、流和输入输出技术文件、流和输入输出技术主要内容n8.1 I/O流概述流概述n什么是流什么是流n8.2 I/O流类流类nI/O流的层次流的层次:n字符流字符流、n字节流字节流、n标准输入标准输入/输出流输出流n8.3 过滤流与流的串接过滤流与流的串接n8.4 文件流类与文件操作文件流类与文件操作n8.5 对象串行化对象串行化n作业作业28.1 I/O 流概述输入/输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。Jdk 提供了包j

2、ava.io,其中包括一系列的类来实现输入/输出处理。进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:FileNotFoundException,EOFException,IOException3什么是流流实际上是一个数据序列。采用流的机制可以使数据有序地输入和输出。输入流与输出流。48.2 I/O流类Java有各种各样的执行I/O的流,在java.io包中定义了这些流,其层次结构图如图8.3所示。编写程序时,java.io包必须被执行输入输出的程序导入。输入输出流可以从以下几个方面进行分类:n从流的方向划分:输入流和输出流;n从流的分工划分:节点流和处理流;n从

3、流的内容划分:字符流和字节流。5I/O流类68.2.1 字符流Java中的字符使用的是Unicode编码,每个字符占有两个字节,即16bit。字符流是以16位的Unicode码表示的字符为基本处理单位,进行文本数据的读写,可以实现Java程序中的内部格式和文本文件、显示输出、键盘输入等外部格式之间的转换。Reader和Writer是java.io包中所有字符流的抽象基类。提供了输出字符的API及其部分实现。7字符流1.ReaderReader类是处理所有字符流输入类的父类。主要有以下方法:n读取字符 public int read()throws IOException;/*读取一个字符,返回

4、值为读取的字符*/public int read(char cbuf)throws IOException;/*读取一系列字符到数组cbuf中,返回值为实际读取的字符的数量*/public abstract int read(char cbuf,int off,int len)throws IOException;/*读取len个字符,从数组cbuf的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/n标记流public boolean markSupported();/*判断当前流是否支持做标记*/public void mark(int readAheadLimit

5、)throws IOException;/*给当前流作标记,最多支持readAheadLimit个字符的回溯。*/public void reset()throws IOException;/*将当前流重置到做标记处*/n关闭流public abstract void close()throws IOException;8字符流2.WriterReader类是处理所有字符流输出类的父类。主要有以下方法:n向输出流写入字符public void write(int c)throws IOException;/将整型值c的低16位写入输出流public void write(char cbuf)t

6、hrows IOException;/将字符数组cbuf写入输出流public abstract void write(char cbuf,int off,int len)throws IOException;/*将字符数组cbuf中的从索引为off的位置处开始的len个字符写入输出流*/public void write(String str)throws IOException;/将字符串str中的字符写入输出流public void write(String str,int off,int len)throws IOException;/*将字符串str 中从索引off开始处的len个字

7、符写入输出流*/nflush()刷空输出流,并输出所有被缓存的字节。n关闭流public abstract void close()throws IOException;93.Reader与Writer的子类从Reader(直接子类6个)和Writer(直接子类7个)派生出的一系列类,以16位的Unicode码表示的字符为基本处理单位。InputStreamReaderOutputStreamWriter CharArrayReaderCharArrayWriter PipedReaderPipedWriter FilterReaderFilterWriter BufferedReaderBu

8、fferedWriter StringReaderStringWriter -PrintWriter108.2.2 字节流字节流字节流类是从抽象类 InputStream和OutputStream派生出来的一系列类。字节(byte)为基本处理单位。1.InputStreamInputStream类直接继承Object类。主要方法如下:n从流中读取数据:int read();/读取一个字节,返回值为所读的字节int read(byte b );/读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量int read(byte b,int off,int le

9、n);/读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量int available();/返回值为流中尚未读取的字节的数量long skip(long n);/读指针跳过n个字节不读,返回值为实际跳过的字节数量n关闭流:close();/流操作完毕后必须关闭n使用输入流中的标记:void mark(int readlimit);/记录当前读指针所在位置,readlimit表示读指针读出readlimit个字节后所标记的指针位置才失效void reset();/把读指针重新指向用mark方法所记录的位置boolean markSupported();/当前的流是

10、否支持读指针的记录功能11字节流字节流2.OutputStream主要方法如下n输出数据void write(int b);/往流中写一个字节bvoid write(byte b );/往流中写一个字节数组bvoid write(byte b,int off,int len);/把字节数组b中从下标off开始,长度为len的字节写入流中nflush()/刷空输出流,并输出所有被缓存的字节由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。n关闭流:close();/流操作完毕后必须关闭12字节流字节流3.Input/OutputStream的子类 FileInputStream、F

11、ileOutputStream PipedInputStream、PipedOutputStream ByteArrayInputStream、ByteArrayOutputStream ObjectInputStream、ObjectOutputStream FilterInputStream、FilterOutputStream StringBufferInputStream SequenceInputStream138.2.3 标准输入/输出在Java应用程序开始执行时(也就是当main方法被执行时),Java自动创建3个与设备关联的流对象:System.in、System.out,Sy

12、stem.err。nSystem.in对象(标准输入流对象)是InputStream类型的,是连接程序与标准输入设备(通常是键盘)的一个输入流对象,当执行System.in.read()操作时,从键盘得到的信息通过System.in流到了程序中。nSystem.out对象(标准输出流对象)是PrintStream类型的,是连接程序和标准输出设备(通常是显示器)的一个输出流对象,当执行System.out.println()语句时,信息流从程序通过System.out流到了屏幕上。示例:参看例8.1/StreamDemo1.javaimport java.io.*;public class St

13、reamDemo1public static void main(String args)throws IOExceptionInputStreamReader in=new InputStreamReader(System.in);char cbuf=new char50;in.read(cbuf);System.out.println(cbuf);148.3 过滤流与流的串接 过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和Fil

14、terOutputStream分别作为所有过滤输入流和输出流的父类。作用:给朴素的Input/OutputStream加上一些修饰某些有用的格式15过滤流类层次结构 16过滤流与流的串接要使用过滤流,首先必须把它串接到某个输入/输出流上,以达到数据转换的目的。通常在构造方法的参数中指定所要连接的流:FilterInputStream(InputStream in);FilterOutputStream(OutputStream out);过滤流:nBufferedInput/OutputStreamnDataInput/OutputStreamnLineNumberInputStreamnPu

15、shBackInputStreamnPrintStream17过滤流BufferedInput/OutputStream(带缓冲的过滤流)n自动利用内存缓冲,不必每次存取外设n还可在其外面再加包装 new DataInputStream(new BufferedInputStream(new FileInputStream(“File1.dat”);18过滤流DataInput/OutputStream(数据流)n对于基本数据类型进行有格式的读写n注意:此处为存储格式,DataOutputStream 与DataInputStream配套使用才有意义n实现了DataInput接口readUTF

16、/Int/Float/Char/Boolean/Long/Double()readLine()读入的重要方法n实现了DataOutput接口nwriteUTF/Int/Float/Char/Boolean/Long/Double()LineNumberInputStreamn提供了行控制能力PushBackInputStreamn提供了超前读入与退回的能力PrintStreamn提供了将各种原始数据输出为文本的方法198.4 文件流类与文件操作 I/O处理中,最常见的是对文件的操作。java.io包中有关文件处理的类有:File、FileDescriptor、FileInputStream、F

17、ileOutputStream、RamdomAccessFile和处理字符文件的FileReaderFileWriter;接口有:FilenameFilter。在进行文件操作时,会产生非运行时异常IOException,必须捕获或声明抛弃。20文件的操作步骤对于文件的操作也就是实现对文件的读写,而不管是文本文件还是二进制文件都可采用相同的步骤:1.把一个合适的流连接到文件;2.使用循环读或写数据;3.关闭流。218.4.1 File类 File类主要用于获取磁盘中文件或目录的信息。能够创建、删除文件、重命名文件、判断文件的读写权限及是否存在,设置和查询文件的最近修改时间等。File类的实例表示

18、主机文件系统中的文件名或路径名。File类提供4个构造函数。npublic File(String name)/*指定与File对象关联的文件或目录的名称,name可以包含路径信息及文件或目录名*/npublic File(String pathToName,String name)/*使用参数pathToName(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*/npublic File(File directory,String name)/*使用现有的File对象directory(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*/npublic File(URI

19、 uri)/*使用给定的统一资源定位符URI对象来定位文件*/示例:参看例8.2、8.3、8.4228.4.2 FileInputStream、FileOutputStream类与读写二进制文件 FileInputStream和FileOutputStream 分别是InputStream和OutputStream的子类,用于处理文件字节流,每次一个字节。nFileInputStream类用来打开一个输入文件,若文件不存在,则会产生非运行时例外FileNotFoundException,必须捕获或声明抛弃;nFileOutputStream类用来打开一个输出文件,若文件不存在,则会创建一个新的

20、文件,否则原文件的内容会被新写入的内容所覆盖。23FileInputStream、FileOutputStream类与读写二进制文件【例8.5】设计一GUI,功能一可按给定的文件名打开二进制文件并显示,功能二能将写好的文本以二进制文件保存。每个二进制文件包含5条记录,每条记录包括3个独立的数据:职员姓名(String类型)、年龄(int类型)和工资(double类型),具体数据随机产生。分析:分析:由图可看出,GUI的设计比较简单,以JFrame为主窗口,添加一个JTextField组件用于写入文件名,并用一个Jlable进行指示;再加入两个JButton组件用于产生读写文件命令;最后加入一个

21、JTextArea组件用于显示记录。接下来要完成的就是两个子任务:写二进制文件与读二进制文件。241)写二进制文件分析:分析:第一步:应选择合适的流类与文件相接。由于要写一个二进制文件,首先选用FileOutputStream类,但它能提供的write()方法只能写入int和byte类型数据,而我们需要能够写入String,double和int。能够写入各种不同类型数据的类是DataOutputStream,对于每种基本类型都有一个方法。将DataOutputStream与FileOutputStream串接起来:DataOutputStream out=new DataOutputStrea

22、m(new FileOutputStream(filename);这个程序将会向DataOutputStream写入数据,然后DataOutputStream通过FileOutputStream将数据传到文件。Filename是传入的文件名参数。25写二进制文件第二步:使用循环写数据。要随机产生5条记录的具体数据,可使用for循环:for(int i=0;i5;i+)out.writeUTF(Name+i);out.writeInt(int)(20+Math.random()*25);out.writeDouble(500.00+Math.random()*100);用writeInt()方法

23、写入一个int,使用writeDouble()方法写入一个double,使用writeUTF方法写入一个String。第三步:关闭输出流。out.close();完成写二进制文件的子任务代码如下:private void writeRecords(String filename)tryDataOutputStream out=new DataOutputStream(new FileOutputStream(filename);for(int i=0;i5;i+)out.writeUTF(=Name+i);out.writeInt(int)(20+Math.random()*25);out.w

24、riteDouble(500.00+Math.random()*100);out.close();catch(IOException e)display.setText(IOERROR:+e.getMessage()+n);262)读二进制文件分析:分析:从二进制文件中读数据的步骤是:n创建一个输入流并打开文件;n读取数据;n关闭文件。首先选择FileInputStream类,它可以根据文件名创建文件输入流。对于使用DataOutputStream类的各种write方法所写的数据文件,必须使用DataInputStream类的对应read方法读入。27读二进制文件这一子任务可由一方法完成如下:

25、private void readRecords(String filename)tryDataInputStream in=new DataInputStream(new FileInputStream(filename);display.setText(Name Age payn);trywhile(true)String name=in.readUTF();int age=in.readInt();double pay=in.readDouble();display.append(name+age+pay+n);catch(EOFException e)finallyin.close()

26、;catch(FileNotFoundException e)display.setText(IOERROR:File not found:+filename+n);catch(IOException e)display.setText(IOERROR:+e.getMessage()+n);288.4.3 RandomAccessFile类RandomAccessFile允许对文件内容同时完成读和写操作,直接继承object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法:nreadXXX()或writeXXX():如ReadInt(),ReadLin

27、e(),WriteChar(),WriteDouble()等。n示例:参看例8.6298.4.4 FileReader、FileWriter类与读写文本文件【例8.7】设计一简易文本编辑器,具有打开、保存文本文件的功能。分析过程类似于二进制文件的读写操作【总结】对于文件的操作也就是实现对文件的读写,而不管是文本文件还是二进制文件都可采用相同的步骤:1.把一个合适的流连接到文件;2.使用循环读或写数据;3.关闭流。308.5 对象串行化(Serialization)8.5.1 对象流能够输入输出对象的流称为对象流。可以将对象串行化后通过对象输入输出流写入文件或传送到其它地方。在java中,允许可

28、串行化的对象通过对象流进行传输。类ObjectOutputStream和ObjectInputStream分别继承了接口ObjectOutput和ObjectInput,将数据流功能扩展到可以读写对象。31对象串行化(Serialization)8.5.2 串行化举例要实现一个对象的串行化,可用两个步骤完成:n第一步创建可串行化对象;n第二步构造对象的输入输出流。1.定义一个可串行化对象在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。例如,定义一个实现Serialiable接口的类Student:pub

29、lic class Student implements Serializableint id;/学号String name;/姓名String department;/系别public Student(int id,String name,int age,String department)this.id=id;this.name=name;this.department=department;32对象串行化(Serialization)2.构造对象的输入/输出流使用ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。Student stu=

30、new Student(030102,Liu Ming,“JSJ);FileOutputStream fo=new FileOutputStream(data.ser);/保存对象的状态ObjectOutputStream so=new ObjectOutputStream(fo);tryso.writeObject(stu);so.close();catch(IOException e)System.out.println(e);FileInputStream fi=new FileInputStream(data.ser);ObjectInputStream si=new ObjectInputStream(fi);/恢复对象的状态trystu=(Student)si.readObject();si.close();catch(IOException e)System.out.println(e);33作业与练习任选一:编写一个程序1.将一个文件的内容添加到另一个文件中(参见习题8.2)。2.列出某目录及其子目录下的所有文件名称及属性(参见习题8.3)。34

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com