计算机科学与技术.ppt
《计算机科学与技术.ppt》由会员分享,可在线阅读,更多相关《计算机科学与技术.ppt(174页珍藏版)》请在三一办公上搜索。
1、第 9 章 Java输入/输出,本章内容,9.1 Java的I/O流9.2 File类9.3 RandomAccessFile类9.4 对象序列化9.5 小结SCJP认证习题解析,学习目标,掌握流式输入/输出的机制了解Java基本I/O类的结构掌握Java流式I/O类中定义的常用方法的使用掌握File对象的创建与操纵理解对象的串行化,9.1 Java的I/O流,流的概念字节流字符流I/O流的套接常用的I/O流类,9.1.1 流(Stream)的概念,在Java中,流是从源到目的地的字节的有序序列;流中的字节依据先进先出,具有严格的顺序,是一种顺序存取方式。,Input stream(输入流),
2、程序-数据源(文件、内存)-打开一个流-读数据,流是有方向的:从输入流读入-不能写数据,Output stream(输出流),程序-数据-写入流-保存到目的地(文件、内存),流是有方向的:向输出流写入-不能读数据,流操作的过程,Reading:open a streamwhile more information read informationclose the stream,Writing:open a streamwhile more information write informationclose the stream,两种结构的流,Java中实现流式I/O的类都在java.io包
3、中;这些类相对于Java程序的另一个端点的不同,分为节点流(Node Stream)和处理流(Processing Stream)。,节点流:从特定源如磁盘文件或内存某区域进行读或写入。处理流:使用其它的流作为输入源或输出目的地。,两种流类的体系,流式I/O类根据操作的数据类型(16位字符或8位字节)分成两个层次体系。,9.1.2 字节流,InputStream和OutputStream是字节流的两个顶层父类,提供了输入/输出流类的通用API;字节流一般用于读写二进制数据;ObjectInputStream和ObjectOutputStream用来实现对象的串行化,即对象的输入、输出。,Inp
4、utStream,java.io 包中所有输入数据流都是由抽象类 InputStream 类继承而来,实现的主要方法有:,int read()该方法返回一个整数,它或者是从数据流中读取的一个字节,或者是-1,以标志数据流的结束。,int read()该方法返回一个整数,它或者是从数据流中读取的一个字节,或者是-1,以标志数据流的结束。,public int read(byte b)将读取的数据保存在一个字节数组中,并返回读取的字节数。,public int read(byte b,int off,int len)从输入流中读取len个字节存储在初始偏移量为off的字节数组中,返回实际读取的字节
5、数。,void close()当结束对一个数据流的操作时应该将其关闭,同时释放与该数据流相关的资源;Java提供系统垃圾自动回收功能,所以当一个流对象不再使用时,可以由运行时系统自动关闭。为提高程序的安全性和可读性,建议读者还是养成显式关闭输入输出流的习惯。,int available()返回可以从数据流中读取的字节数。long skip(long l)跳过数据流中指定数量的字节不读,返回值表示实际跳过的字节数。,支持回推操作的数据流中的方法:boolean markSupported()用于指示数据流是否支持回推操作,当一个数据流支持方法时返回true,反之返回false。,void mar
6、k(int readlimit)用于标记数据流的当前位置。void reset()在执行完随后的read()操作后,调用方法reset()将回到输入数据流中被标记的位置。,输入字节流类的层次,OutputStream,与输入流类似,java.io包中所有输出数据流都是从抽象类OutputStream类继承而来,并且实现了其中所有方法。,void write(int i)将字节 i 写入到数据流。注意:该方法是抽象方法,其输出流子类必须加以实现。,public void write(byte b)将字节数组b的内容写入输出流。,public void write(byte b,int off,i
7、nt len)将字节数组b中从偏移量off开始的len个字节写入输出流。,输出字节流类的层次,9.1.3 Reader 和 Writer,Java提供的对不同平台之间数据流中数据进行转换的功能。ASCII字符集是以一个字节(8bit)来表示一个字符,可以认为一个字符就是一个字节(byte);,Java使用Unicode表示字符串和字符,用两个字节(16bit)来表示一个字符,字节与字符就不再一样;为了实现与其他语言及不同平台进行交互,Java提供了一种16位的数据流处理方案,使得数据流中的数据可以进行与以往16位平台时的相同处理。这种16位方案被称作读者和写者。,字节流与字符流的比较,字节流与
8、字符流的主要区别在于处理的数据类型;Reader/Writer与InputStream/OutputStream具有相类似的API,并且每个核心的输入/输出字节流,都有相应的Reader和Writer版本。,输入字符流类的层次,输出字符流类的层次,Reader类,public int read()读一个字符作为方法的返回值,如果返回-1,则表示到达流的末尾。public int read(char cbuf)读字符保存在数组中,并返回读取的字符数。,Reader类,public abstract int read(char cbuf,int off,int len)读字符存储在数组的指定位置,
9、返回读取的字符数。public long skip(long n)从输入流中最多跳过n个字符,返回跳过的字符数。public boolean ready()当输入流准备好可以读取数据时返回true;否则返回false。,Reader类,public boolean markSupported()当输入流支持mark方法时返回true,否则返回false。public void mark(int readAheadLimit)标记当前的位置,参数用于设置从标记位置处开始可以读取的最大字符数。public void reset()将输入流重新定位到最后一次mark方法标记的位置。public ab
10、stract void close()关闭输入流,并释放与流关联的所有系统资源。,Writer类,public void write(int c)将参数c的低16个bit写入输出流。public void write(char cbuf)将字符数组cbuf的内容写入输出流。public abstract void write(char cbuf,int off,int len)将字符数组cbuf中,从偏移量off开始的len个字符写入输出流。,Writer类,public void write(String str)将字符串str中全部字符写入输出流。public void write(Str
11、ing str,int off,int len)将字符串str中,从偏移量off开始的len个字符写入输出流。public abstract void flush()刷新输出流,强制写出所有缓冲的输出字符。public abstract void close()关闭输出流,释放与该流相关联的所有系统资源。,9.1.4 输入/输出流的套接,数据源,程序,FileInputStream,BufferedInputStream,DataInputStream,示例:实现基本数据类型的读取,InputStreamReader is=new InputStreamReader(System.in);,B
12、ufferedReader in=new BufferedReader(is);,创建一个用于接收从键盘输入的字符数据的对象,创建一个BufferedReader对象从键盘逐行读入数据,数据接收节点,程序,FileOutputStream,BufferedOutputStream,DataOutputStream,示例:实现基本数据类型的写入,9.1.5 常用的I/O流类,java.io包中的节点流,java.io包中的节点流,java.io包中的节点流,java.io包中的节点流,java.io包中的处理流,java.io包中的处理流,java.io包中的处理流,java.io包中的处理流,
13、FileInputStream/FileOutputStream,这两个类用来进行文件的I/O处理,其数据源应当是文件;构造文件数据流时,可直接给出文件名,例如:FileInputStream fis=new FileInputStream(myFile);FileOutputStream fos=new FileOutputStream(myFile);,常用构造方法:,public FileInputStream(String name)throws FileNotFoundException public FileInputStream(File file)throws FileNotF
14、oundException,常用构造方法:,public FileOutputStream(String name)throws FileNotFoundException public FileOutputStream(String name,boolean append)throws FileNotFoundException public FileOutputStream(File file)throws FileNotFoundException public FileOutputStream(File file,boolean append)throws FileNotFoundEx
15、ception,例9-1:在系统当前目录下读取source.jpg文件内容并复制生成新文件dest.jpg。,/创建文件输入/输出字节流。fis=new FileInputStream(source.jpg);fos=new FileOutputStream(dest.jpg);,source.jpg,FileInputStream,关联:fis,dest.jpg,FileOutputStream,关联:fos,import java.io.*;public class FileStreamTest public static void main(String args)throws IOEx
16、ception FileInputStream fis=null;FileOutputStream fos=null;try fis=new FileInputStream(“Source.jpg”);fos=new FileOutputStream(“dest.jpg”);,声明并创建文件输入/输出字节流,byte b=new byte1024;int count;while(count=fis.read(b)0)fos.write(b,0,count);,读取文件source.jpg的内容,并复制生成文件dest.jpg。,【讨论事项】,使用FileInputStream读取源文件时,如果
17、源文件没有指定路径则表示在当前系统默认目录下,并且源文件一定要存在。使用FileOutputStream将数据写入目标文件时,如果目标文件不存在则会自动创建,但目标文件指定的路径也不存在时,则不会创建文件而是抛出FileNotFoundException。,【讨论事项】,使用I/O流类时一定要处理异常。FileReader/FileWriter类与FileInputStream/FileOutputStream类中的方法功能相同,二者的区别在于读写文件内容时读写的单位不同,FileReader/FileWriter类以字符为单位而FileInputStream/FileOutputStream
18、类以字节为单位。通常情形下,FileReader/FileWriter用于读写文本文件。,catch(IOException e)e.printStackTrace();finally fis.close();fos.close();,异常处理及文件输入/输出流的关闭,使用类FileReader/FileWriter读/写文件的示例,try fs=new FileWriter(source.txt);fs.write(很高兴学习java!);fs.close();fr=new FileReader(source.txt);fd=new FileWriter(dest.txt);int c;Sy
19、stem.out.print(源文件内容:);while(c=fr.read()!=-1)System.out.print(char)c);fd.write(c);,fd.close();fr.close();System.out.print(n目标文件内容:);ft=new FileReader(dest.txt);char ch=new char100;int count;while(count=ft.read(ch)!=-1)System.out.print(new String(ch,0,count);ft.close();,catch(IOException e)e.printSta
20、ckTrace();,【运行结果】源文件内容:很高兴学习java!目标文件内容:很高兴学习java!,【讨论事项】,由于中文字符存储时占2个字节,上面文本文件在使用FileInputStream类来读取时以字节为单位,如果read方法读取时只读到了中文字符编码的1个字节,则会输出乱码。FileReader类中的read方法以字符为单位读取,这样可以保证文本文件中的中文字符可以正确读取。,数据流,数据流包括数据输入流DataInputStream类和数据输出流DataOutputStream类,它们允许按Java的基本数据类型读写流中的数据。数据输入流以一种与机器无关的方式读取Java基本数据类
21、型以及使用UTF-8修改版格式编码的字符串,DataInputStream,public class DataInputStream extends FilterInputStream implements DataInputDataInputStream类的构造方法为:public DataInputStream(InputStream in)。,DataInputStream类中读取数据的方法,public final boolean readBoolean()public final byte readByte()public final short readShort()public
22、final char readChar()public final int readInt(),DataInputStream类中读取数据的方法,public final long readLong()public final float readFloat()public final double readDouble()public final String readUTF(),DataOutputStream,public class DataOutputStream extends FilterOutputStream implements DataOutputDataOutputSt
23、ream类的构造方法为:public DataOutputStream(OutputStream out),DataOutputStream类中写入数据的方法,public final void writeBoolean(boolean v)public final void writeByte(int v)public final void writeShort(int v)public final void writeChar(int v)public final void writeInt(int v),DataOutputStream类中写入数据的方法,public final voi
24、d writeLong(long v)public final void writeFloat(float v)public final void writeDouble(double v)public final void writeUTF(String str),使用类DataInputStream/DataOutputStream按数据类型读/写数据的示例。,try fos=new FileOutputStream(write.dat);dos=new DataOutputStream(fos);dos.writeUTF(Java程序设计);dos.writeDouble(30.6);d
25、os.writeInt(337);dos.writeBoolean(true);dos.close();,fis=new FileInputStream(write.dat);dis=new DataInputStream(fis);System.out.println(书名:+dis.readUTF();System.out.println(单价:+dis.readDouble();System.out.println(页数:+dis.readInt();System.out.println(“是否适合初学者:+dis.readBoolean();dis.close();,catch(IOE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机科学 技术
链接地址:https://www.31ppt.com/p-4995699.html