第8章+输入输出

上传人:沈*** 文档编号:244382790 上传时间:2024-10-04 格式:PPT 页数:59 大小:550KB
返回 下载 相关 举报
第8章+输入输出_第1页
第1页 / 共59页
第8章+输入输出_第2页
第2页 / 共59页
第8章+输入输出_第3页
第3页 / 共59页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,8,章 输入输出,1,主要内容,8.1 I/O,流的概念,8.2 I/O,流的分类,8.3,文件读写,2,Java I/O,的特点,Java,的,I/O,类库主要包含在,java.io,和,jaba.nio,两个包里。,Java I/O,的使用缺乏直观性,底层实际上是采用了标准的,C I/O,库,在此基础上进行了封装。,3,1,、,I/O,流的概念,流,(Stream),,流就是不同类型的输入源与输出源的一个统称。,输入或输出的字符串、文字、图像、声音等,称之为,数据流,。,4,流可分为输入流和输出流两类,输入流:,数据提供者,可从中读取数据出来,输出流:,数据接收者,可往其中写数据,5,读,打开一个流,读信息,关闭流,7,写,打开一个流,写信息,关闭流,8,8.2 I/O,流的分类,在,JDK1.1,之前,,java.io,包中的流只有普通的,字节流,(byte oriented stream),(以,8,位的字节为基本处理单位的流)。,从,JDK1.1,开始,,java.io,包中加入了专门用于,字符流,(character oriented stream),处理的类(以,16,位的字节为处理单元)。,9,以,字节流为基础,的,用于对象,的永久化保存状态的机制,对象流,(object steam),。,字符流:专门用于字符数据,通常是文本文件。,字节流:用于处理图片,声音之类的二进制数据。,11,8.2.1,字节流,(byte oriented steam),数据源或目标中含有非字符数据,必须用字节流来输入,/,输出,通常被用来读写诸如图片、声音之类的二进制数据,12,绝大多数数据是被存储为二进制文件的,世界上的文本文件大约只能占到,2,;,通常二进制文件要比含有相同数据量的文本文件小得多。,InputStream,和,OutputStream,是用来处理,8,位字节流的抽象基类,程序使用这两个类的子类来读写,8,位的字节信息。,14,图,8-3,字节流的子类,表,8-1 InputStream,主要子类及其功能,表,8-2 OutputStream,主要子类及其功能,15,8.2.2,字符流,通常处理文本文件,字符流的抽象类,Reader,和,Writer,java.io,包中所有字符流的抽象基类,Reader,提供了输入字符的,API,Writer,提供了输出字符的,API,多数程序使用这两个抽象类的一系列子类来读入,/,写出文本信息,例如,FileReader/FileWriter,用来读,/,写文本文件,16,图,8-4,字符流的子类,表,8-3 Reader,的主要子类及其功能,表,8-4 Writer,的主要子类及其功能,表,8-5,字节流与字符流的比较,8.2.3,标准输入输出数据流,标准输入输出流对象,(java.lang.system),System,类的静态成员变量,包括,System.in,:,作为字节输入流类,InputStream,的对象,代表标准输入流,其中有,read,()方法从键盘接收数据。,默认状态对应于键盘输入。,System.out,:,作为输出流类,PrintStream,的对象,代表标准输出。其中有,print,和,println,两个方法,默认状态对应于屏幕输出。,System.err,:,PrintStream,类型的,代表标准错误信息输出流,默认状态对应于屏幕输出。,18,1 .,直接采用,System.in,读入数据,/Input.java,import java.io.*;,public class Input ,public static void main(String args) throws IOException ,BufferedReader in = new,BufferedReader(,new InputStreamReader(System.in);,String s;,while(s = in.readLine().length() != 0),System.out.println(s);,图,8-5,从键盘输入处理流程图,说明:,System.in,程序启动时由,Java,系统自动创建的流对象,它是原始的字节流,不能直接从中读取字符,需要对其进行进一步的处理。,21,InputStreamReader(System.in),继承自字符流基类,Reader,以,System.in,为参数创建一个,InputStreamReader,流对象,相当于字节流和字符流之间的一座桥梁,读取字节并将其转换为字符,22,BufferedReader in,(,继承自字符流基类,Reader,),对,InputStreamReader,处理后的信息进行缓冲,以提高效率,23,2.,采用,Java.util.Scanner,类,JDK5,后采用新的,java.util.Scanner,类能够包装处理字符数据源,可以从,scanner,里一次抽取一组字符,把它们解释成整数,长整数,浮点数和字符串等。,如:,Scanner sc = new Scanner(System.in);,如果知道从标准输入中读取的数据类型,如输出:,“,请输入你的年龄:,”,int age = sc.nextInt();,24,每一种基本数据类型都存在一个相应的,nextSomething(),方法。,public boolean nextBoolean();,public short nextShort();,public int nextInt();,public double nextDouble();,public String next();,25,3.,采用,java.io.Console,JDK6,中提供了,java.io.Console,类专用来访问基于字符的控制台设备 。,用于替代标准输入输出流。具有标准流提供的大部分特性,还具有其它一些特性,特别适用于安全密码的输入。,表,8-6 java.io.Console,类的方法。,26,Java,的,printf,JDK5,分别在,java.io.PrintStream,和,java.io.PrintWriter,类中增加了,printf(),方法。,如同,C,语言的,printf,支持格式化输出。,27,int age = 27;,System.out.printf(,“,your age is: %dn,”,age);,System.out.printf(,“,Pi is %7.3fn,”, Math.PI);,28,4.,采用,java.util.Formatter,类,java.util.Formatter,类提供了详细的格式定义符定义。并且,支持,printf,风格的字符串格式;,支持布局对齐和排列;,支持数值、字符串和日期,/,时间数据的常规格式和特定语言环境输出。,【,例,8-1】,综合运用,System.in,、,Scanner,、,printf,、以及格式化输出示例。,8.3,文件的读写,8.3.1,按字符写入,8.3.2,按字符读出,8.3.3,按字节写入,8.3.4,按字节读出,8.3.5 File,类,8.3.6,随机文件的读取,30,8.3.1,按字符写入,FileWriter,,,BufferedWriter,在磁盘上创建一个文本文件并往其中写入字符数据。,FileWriter,类,使用字符流,Writer,派生的,OutputStreamWriter,下的子类,FileWriter,类。,31,通过,writer(),方法向文件里写入字符。,在进行文件写入时,,FileWriter,类的父类,OutputStreamWriter,及上一级父类,Writer,类的方法都可以使用。,表,8-7 FileWriter,类的方法,【,例,8-2】,创建一个文件,用,FileWriter,实现往文件里写入字符流数据。,33,BufferedWriter,类,如果需要写入的内容很多,就应该使用更为高效的缓冲器流类,Writer-BufferedWriter,34,FileWriter,和,BufferedWriter,类都用于输出字符流,包含的方法几乎完全一样,但,BufferedWriter,多提供了一个,newLine(),方法用于换行。,【例,8-3】,创建一个文件,采用,BufferedWriter,实现往文件里写入字符流数据。,8.3.2,按字符读出,FileReader, BufferedReader,FileReader,类,从文本文件中读取字符,继承自,Reader,抽象类的子类,InputStreamReader,表,8-8 FileReader,类的方法,【,例,8-4】,用,FileReader,实现从文件中读取字符流数据。,36,BufferedReader,读文本文件的缓冲器类,具有,readLine(),方法,可以对换行符进行鉴别,一行一行地读取输入流中的内容,继承自,Reader,文件读取方法:,BufferedReader in = new,BufferedReader,(new,FileReader,(,fileName,) );,【,例,8-5】,采用,BufferedReader,实现从文件里逐行读取数据。,38,8.3.3,按字节写入,FileOutputStream, DataOutputStream,BufferedOutputStream,二进制文件:,不能用文本编辑器来写,例如应用程序;,包含要被解释为字体、格式、图形和其他非字符信息。,用字节流可以正确读取,39,FileOutputStream,DataOutputStream,BufferedOutputStream,提供了很多方法用于文件的写入,抽象类,OutputStream,子类,FileOutputStream,用于将二进制数据写入文件,子类,DataOutputStream,具有写各种基本数据类型的方法,【例,8-6】DataOutputStream,与,FileOutputStream,连接起来写入不同类型数据到文件。,41,BufferedOutputStream,类实现缓冲的输出流,【,例,8-7】,使用高效的,BufferedOutputStream,写入不同数据类型到文件里。,8.3.4,按字节读出,FileInputStream, DataInputStream, BufferedInputStream,类似于写二进制文件,,,FileInputStream, DataInputStream, BufferedInputStream,也提供了很多方法用于读入基本数据。,【例,8-8】,以字节流方式从文件里读出基本数据类型数据。,43,BufferedInputStream,类实现了字节流数据通过缓冲区的高效输入。,【,例,8-9】,使用高效,BufferedInputStream,以字节方式从文件里读出数据。,8.3.5File,类,File,类是文件和目录路径名的抽象表示形式。,定义了一些与平台无关的方法来操纵文件,:,创建、删除文件,重命名文件,判断文件的读写权限及是否存在,设置和查询文件的最近修改时间等,45,表,8-15 File,类常用方法。,【,例,8-10】File,类常用操作示例。,8.3.6,随机文件的读写,欲对文件内容的某一指定部分进行读写操作,采用类,RandomAccessFile,提供的功能。,类,RandomAccessFile,直接继承,object,,并且同时实现了接口,DataInput,和,DataOutput,。,表,8-16 RandomAccessFile,类随机文件操作的方法。,RandomAccessFile,类有两个,RandomAccessFile,方法可用于生成随机文件对象 :,RandomAccessFile(File file, String mode),RandomAccessFile(String name, String mode),提供了支持随机文件操作的方法:,readXXX(),或,writeXXX(),:,如,ReadInt(), ReadLine(), WriteChar(), WriteDouble(),等。,int skipBytes(int n),:将指针向下移动若干字节,length(),:返回文件长度,long getFilePointer(),:返回指针当前位置,void seek(long pos),:将指针调到所需位置,49,File f = new File(“file.txt”);,new RandomAccessFile(f, “r”);,new RandomAccessFile(f, “rw”);,new RandomAccessFile(“file1.txt”, “r”);,new RandomAccessFile(“file2.txt”, “rw”);,【,例,8-11】,实现把一个整型数组存入文件中,然后从文件末把数据读出来。,Jdk7,新特性,在目前版本的,java,中,当你操作流时,一定会加,try.finally,以保证出现异常时,流能被正确关闭。,BufferedReaderbr=newBufferedReader(newFileReader(path);,try,returnbr.readLine();,finally,br.close();,51,在,JDK7,里,你只需要将资源定义在,try(),里,,Java7,就会在,readLine,抛异常时,自动关闭资源。,另外,资源类必须实现,Disposable,接口。支持管理多个资源,。,try(BufferedReaderbr=newBufferedReader(newFileReader(path),returnbr.readLine();,52,8.4,对象流,(Object Serialization),ObjectInputStream/ObjectOutputStream,对象序列化,(Object Serialization),的过程就是,对象写入字节流,和,从字节流中读取对象,把,Java,对象转换为字节序列的过程称为,对象的序列化,。,53,把字节序列恢复为,Java,对象的过程称为,对象的反序列化,。,对象序列化可以把,Java,对象和基本数据类型转换成一个适合于网络或文件系统的字节流。,也就是实现将一个,Java,对象和一个二进制流相互转换。,对象的序列化主要有两种用途:,1),把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中,;,2),在网络上传送对象的字节序列:,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。,55,发送方需要把这个,Java,对象转换为字节序列, 才能在网络上传送,;,接收方则需要把字节序列再恢复为,Java,对象。,对象序列化功能非常简单、强大,在,RMI,、,Socket,、,EJB,都有应用。,56,ObjectInputStream,和,ObjectOutputStream,实现对象的读写,通过,ObjectOutputStream,把对象写入磁盘文件,通过,ObjectInputStream,把对象读入程序,57,不保存对象的,transient,及,static,类型的变量,当序列化某个对象时,如果该对象的某个变量是,transient,,那么这个变量不会被序列化进去。,对于需要屏蔽的数据,如密码可以定义为,transient,变量,对象要想实现序列化,其所属的类必须实现,Serializable,接口,【,例,8-12】,59,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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