您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Java面向对象程序设计第08章_Java-IO流
信息工程学院本科课程第8章输入输出流主讲:赵建邦办公室:信息学院202E-mail:zhaojianbang@nwsuaf.edu.cn信息工程学院本科课程2本章主要内容8.1什么是javaIO8.2File类8.3字节流和字符流8.4随机流8.5数组流8.6数据流8.7对象流8.8序列化与对象克隆难点:序列化与对象克隆信息工程学院本科课程8.1什么是javaIOIO(Input/Output)是计算机输出/输出的接口。Java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中的IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入信息工程学院本科课程8.1.1输入输出流示意图输入流示意图输出流示意图源目的地数据源和目的地可以来自于文件、内存和网络等信息工程学院本科课程8.1.2java.io的分类总体来说,IO有四个顶层类:字节流处理单元为1个字节,操作字节和字节数组字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串字节流字符流输入输出InputStreamOutputStreamReaderWriter注意,这四个类为抽象类,不能直接用来创建对象信息工程学院本科课程8.2File类1、创建文件File(Stringfilename);File(stringdirectoryPath,Stringfilename);File(Filefp,Stringfilename);f.createNewFile();2、删除文件f.delete();例FileTest.java注:delete方法删除由File对象的路径所表示的磁盘文件。它只能删除普通文件,而不能删除目录,即使是空目录也不行。信息工程学院本科课程8.2File类3、文件的属性关于File类的其它方法,是不需要死记硬背的,在需要时可以查看JDK文档,就会明白怎么使用。初步接触了File类,我们发现File类不能访问文件的内容,即不能够从文件中读取数据或往文件里写数据,它只能对文件本身的属性进行操作:创建、删除、重命名、判断读写权限、设置和查询最近修改时间等4、运行可执行文件例FileRuntimeTest.java信息工程学院本科课程8.2File类5、创建目录publicbooleanmkdir()方法创建目录6、罗列目录中的文件publicString[]list();publicFile[]listFiles();添加文件名过滤器(FilenameFilter)参数publicString[]list(FilenameFilterobj);publicFile[]listFiles(FilenameFilterobj);需要实现FilenameFilter接口的accept方法例12.2信息工程学院本科课程8.3字节流和字符流信息工程学院本科课程8.3字节流和字符流信息工程学院本科课程8.3.1文件字节流创建FileInputStream对象以字节为单位读取文件(注意返回值不一样)intread()//返回字节值intread(byteb[])//返回读取的字节个数intread(byteb[],intoff,intlen)FileInputStreaminOne=newFileInputStream(hello.test);Filef=newFile(hello.test);FileInputStreaminTwo=newFileInputStream(f);信息工程学院本科课程8.3.1文件字节流FileOutputStream以字节为单位写文件publicvoidwrite(byteb[])publicvoidwrite(byteb[],intoff,intlen)调用close()方法关闭流由于汉字在内存中占用两个字节,如果使用字节流,读取不当会出现乱码现象例FileStream.java信息工程学院本科课程8.3.2文件字符流文件字符流的源和目的地是文件FileReader(Stringfilename)FileReader(Filefilename)FileWriter(Stringfilename)FileWriter(Filefilename)read()和write()方法以字符为基本单位处理数据流write()方法使用缓冲区例FileReaderTest.java信息工程学院本科课程8.3.3缓冲流当程序处理的文件按行组织,并且行不是定长时,可采用缓冲式输入输出方式,简化操作缓冲式输入:对于程序的输入请求,系统一次性输入足够多的内容放在内存缓冲区中,供程序以后的输入请求使用,待缓冲区的内容用完,再一次性输入足够多的数据缓冲式输出:对于程序的输出请求,系统先将内容暂存于缓冲区,待缓冲区满或输出结束,才将暂存与缓冲区中的内容输出到流的目的地信息工程学院本科课程8.3.3缓冲流/**创建一个FileReader对象.*/FileReaderfr=newFileReader(mytest.txt);/**创建一个BufferedReader对象.*/BufferedReaderbr=newBufferedReader(fr);/**读取一行数据.*/Stringline=br.readLine();while(line!=null){System.out.println(line);line=br.readLine();}/**流的关闭.*/br.close();fr.close();创建一个FileReader对象创建一个BufferedReader对象用BufferedReader读文本文件信息工程学院本科课程8.3.3缓冲流用BufferedWriter写文本文件/**创建一个FileWriter对象*/FileWriterfw=newFileWriter(mytest.txt);/**创建一个BufferedWriter对象*/BufferedWriterbw=newBufferedWriter(fw);bw.write(大家好!);bw.write(我正在学习BufferedWriter。);bw.newLine();bw.write(请多多指教!);bw.newLine();bw.flush();fw.close();创建一个BufferedWriter对象创建一个FileWriter对象信息工程学院本科课程8.3.3缓冲流上层流上层流的源和目的地是输入流或输出流。上层流封装了其他输入输出流,提供缓冲、格式化等多功能输入输出如缓冲流、数据流、对象流等底层流直接从文件、内存、网络中读取字节(每次一个)信息工程学院本科课程8.4随机流RandomAccessFile直接继承自Object类随机流创建的流的指向可以是源也可以是目的地,但仅限于操作文件myRAFile=newRandomAccessFile(Stringname,Stringmode);myRAFile=newRandomAccessFile(Filefile,Stringmode);mode的取值为“r”或“rw”seek(longa):文件位置指示器getFilePointer():当前的读写位置例RandomFileTest.java信息工程学院本科课程8.5数组流数组流包括字节数组流和字符数组流,用于操作内存数据问题:对数组的读写非常简单,我们为什么不直接读写字节数组呢?内存虚拟文件或者是内存映像文件,是把一块内存虚拟成一个硬盘上的文件,原来该写到硬盘文件上的内容会被写到这个内存中,原来该从一个硬盘文件上读取内容可以改为从内存中直接读取。如果程序在运行过程中要产生一些临时文件,就可以用虚拟文件的方式来实现,我们不用访问硬盘,而是直接访问内存,会提高应用程序的效率。信息工程学院本科课程8.5数组流ByteArrayInputStream的每个构造函数都需要一个字节数组来作为数据源:ByteArrayInputStream(byte[]buf)ByteArrayInputStream(byte[]buf,intoffset,intlength)ByteArrayOutputStream也有两种构造方法:ByteArrayOutputStream()ByteArrayOutputStream(int)第一种形式的构造函数创建一个32字节的缓冲区,第二种形式则是根据参数指定的大小创建缓冲区,缓冲区的大小在数据过多时能够自动增长。例ByteArrayTest.java信息工程学院本科课程8.6数据流DataInputStream与DataOutputStream提供了可以读写各种基本数据类型的数据的各种方法UTF字符编码规则:假如字符c的范围在\u0001和\u007f之间,对应的UTF码占一个字节,内容为:(byte)c。假如字符c是\u0000或其范围在\u0080和\u07ff之间,对应的UTF码占两个字节,内容为:(byte)(0xc0|(0x1f&(c6))),(byte)(0x80|(0x3f&c))。假如字符c的范围在\u0800和uffff之间,对应的UTF码占三个字节,内容为:(byte)(0xe0|(0x0f&(c12))),(byte)(0x80|(0x3f&(c6))),(byte)(0x80|(0x3f&c))例DataStreamTest.java信息工程学院本科课程8.7对象流ObjectInputStream和ObjectOutputStream是用于存储和读取对象的输入输出流类。只要把对象中的所有成员变量都存储起来,就等于保存了这个对象;只要读取到一个对象中原来保存的所有成员变量的取值,就等于读取到了一个对象。这两个类可以帮我们完成保存和读取对象成员变量取值的过程前提:要读写或存储的对象必须实现了Serializable接口。ObjectInputStream与ObjectOutputStream类不会保存和读取对象中的transient和static类型的成员变量,使用ObjectInputStream与ObjectOutputStream类保存和读取对象的机制叫序列化transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分信息工程学院本科课程练习:创建一个学生对象,并把它输出到一个文件中;将该对象读出来,并还原打印:关键代码:FileOutputStreamfos=newFileOutputStream(mytext.txt);ObjectOutputStreamos=newObjectOutputStream(fos);os.writeObject(stu);//stu是一个Student对象os.close();FileInputStreamfi=newFileInputStream(mytext.txt);ObjectInputStreamsi=newObjectInputStream(fi);stu=(Student)si.readObject();si.close();信息工程学院本科课程8.8序列化与对象克隆clone()方法生成一个新的克隆对象,该对象与原对象具有不同的引用通过序列化(Serialize)可以方便地实现对象的克隆将原对象写入输出流目的地(序列化)将该目的地作为新对象输入流的源信息工程学院本科课程讨论:java.lang包java.lang包是使用率最高的包,因此可以不用import语句,被自动导入所有的程序万物皆对象Object类是类层次结构的根类System类有三个静态的成员变量:staticInputStreamin:“标准”输入流staticPrintStreamout:“标准”输
本文标题:Java面向对象程序设计第08章_Java-IO流
链接地址:https://www.777doc.com/doc-6288809 .html