收藏 分享(赏)

Java课程讲义(No.10).ppt

上传人:saw518 文档编号:4529236 上传时间:2019-01-02 格式:PPT 页数:57 大小:431.50KB
下载 相关 举报
Java课程讲义(No.10).ppt_第1页
第1页 / 共57页
Java课程讲义(No.10).ppt_第2页
第2页 / 共57页
Java课程讲义(No.10).ppt_第3页
第3页 / 共57页
Java课程讲义(No.10).ppt_第4页
第4页 / 共57页
Java课程讲义(No.10).ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

1、Java面向对象程序设计,主讲教师:郑大庆 上海财经大学 信息管理与工程学院,第十讲 Java的输入和输出,2,上海财经大学 信息管理与工程学院,主要方式、范围,流式I/O基础随机读取文件Java文件管理对象输入/输出流,3,上海财经大学 信息管理与工程学院,输入输出的基本概念,程序与用户之间的沟通桥梁 程序接受输入:磁盘,内存,外设(键盘) 程序输出:磁盘,外设(屏幕,打印机),4,上海财经大学 信息管理与工程学院,流:从源到目的的字节的有序序列,先进先出。 Java中的输入输出是以流的方式处理,顺序读取。,流(Stream)的概念,流的方向性,5,上海财经大学 信息管理与工程学院,流操作

2、的过程,Reading:open a stream while (more data) read data close the stream,Writing :open a stream while (more data)write data close the stream,6,上海财经大学 信息管理与工程学院,基本类,两种基本流(抽象类): 输入流(InputStream, read) 输出流(OutputStream, write) 基本类中定义了完成基本I/0操作的抽象方法 读写操作:read(),write() 关闭流的操作:close() 强制送出并清空缓冲区数据的操作:flush

3、() 输入/输出流:标准类,位于java.io包中 流的读操作过程:打开流执行读操作 关闭流 流的写操作过程:打开流执行写操作 关闭流,7,上海财经大学 信息管理与工程学院,流的分类:字节流和字符流,流式I/O类根据操作的数据类型(16位字符或字节)分成两个层次体系。 字节流:数据以8位字节为单位进行读写 字符流:数据以16位字符(Unicode)为单位进行读写(Java中通常指的流是字节流),8,上海财经大学 信息管理与工程学院,流的分类:两种结构的流,节点流(Node Stream ):从特定源(如磁盘文件或内存某区域)进行读或写入。 过滤流(Filter Steam):使用其它的流作为输

4、入源或输出目的地。,l l e h,o,节点流(输入),过滤流(输入),其他流,源,9,上海财经大学 信息管理与工程学院,节点流,过滤流,注:,字节流输入流类层次,10,上海财经大学 信息管理与工程学院,是所有表示输入字节流类的父类(抽象类)适于读取面向字节的数据(字节流) 三个基本read()方法 int read() /从输入流中读一个字节并返回(-1表示文件结束) int read(byte b) /从输入流中连续读多个字节到数组b中, 返回读的字节数 int read( byte b, int off, int len ) /从输入流中读len个字节到数组b中。off是写入数组的位置。

5、,InputStream,11,上海财经大学 信息管理与工程学院,其它方法 void close( ) /关闭流。对于过滤流,则自顶向下关闭之 int available() /返回未读的字节数 long skip(long n) / 跳过n个字节 boolean markSupported( ) /测试打开的流是否支持书签(回读) void mark(int i) /标记当前流,并建立大小为i的缓冲区 void reset( ) / 返回标签处,InputStream,12,上海财经大学 信息管理与工程学院,节点流,过滤流,注:,字节流输出流类层次,13,上海财经大学 信息管理与工程学院,O

6、utputStream是所有表示输出字节流类的父类。 功能:接受要输出的字节并将它送往目的地。 三个基本的write( )方法void write() / 向输出流写一个字节void write(byte b) /向输出流写一个字节数组void write(byte b, int off, int len ) 其它方法void close( ) void flush( ) / 强行将缓存数据写出去,一般在调用close()方法关闭流前,可以先调用flush()方法。,OutputStream,14,上海财经大学 信息管理与工程学院,Reader和Writer:字符流的两个抽象超类 Reader

7、和Writer 类实现字节和字符间的自动转换。 每一个核心输入、输出流字节流,都有相应的Reader和Writer版本。例如:FileInputStream (字节流)FileReader (字符流)PipedInputStream (字节流)PipedReader (字符流),字符流,一般规律:由XXXReader/Writer替代XXXInputStream/OutputStream,15,上海财经大学 信息管理与工程学院,节点流,过滤流,注:,Reader的类层次,16,上海财经大学 信息管理与工程学院,int read();/读一个字符并将它作为int型数返回给调用语句(-1表示文件结

8、束) int read(char cbuf);/读字符放入数组中 int read(char cbuf, int off, int len);/读字符放入数组的指定位置 void close( ) /关闭流。 long skip(long n) / 跳过n个字符 boolean markSupported( ) /测试打开的流是否支持书签(回读) void mark(int) /标记当前流,并建立int大小缓冲区 void reset( ) / 返回标签出 boolean ready() /测试当前流是否准备好进行读,Reader的基本方法,17,上海财经大学 信息管理与工程学院,节点流,过滤

9、流,注:,Writer的类层次,18,上海财经大学 信息管理与工程学院,int write(int c) ; / 写单个字符 int write(char cbuf) ;/ 写字符数组 int write(char cbuf, int off, int len) ; int write(String str) ; int write(String str, int off, int len) ;void close( ) void flush( ) / 强行将缓存数据写出,Writer的基本方法,19,上海财经大学 信息管理与工程学院,Reader 和 InputStream以及Writer

10、与 OutputStream定义的API类似,但操作的数据类型不同,每个核心的输入输出字节流,都有对应的输入输出字符流。所有的流InputStream、 OutputStream 、Reader、 Writer 在创建时自动打开;程序中可以调用close方法关闭流,否则Java运行环境的垃圾收集器将隐含将流关闭。 字节流适用于读取二进制数据,例如图像和声音数据,限于处理ISO-Latin-1的8位字节;而字符流能够处理Unicode字符集中的所有字符,应该使用字符流来读写文本类型数据。,比较:字节流与字符流,20,上海财经大学 信息管理与工程学院,节点流类,21,上海财经大学 信息管理与工程学

11、院,过滤流类1,22,上海财经大学 信息管理与工程学院,过滤流类1,23,上海财经大学 信息管理与工程学院,输入/输出流的套接,流的使用经常会出现套接的现象,利用各种流的特性共同处理数据,套接的多个流构成了一个流链。,输入/输出流链示例,24,上海财经大学 信息管理与工程学院,作用:对文件系统中的文件进行读写,属于节点流 文件流类包括:FileReader,FileWriter, (字符流)FileInputStream,FileOutputStream(字节流) 创建文件流:常用文件名或File类的对象创建文件流。文件流的创建调用了相应类的构造方法,并经常以字符串形式的文件名或一个File类

12、的对象作为参数。 构造方法: public FileInputStream(String name);FileInputStream in= new FileInputStream(“myfile.txt”);public FileInputStream(File file);File f=new file(“myfile.txt”);FileInputStream in= new FileInputStream(f);,常用I/O流(一):文件流,25,上海财经大学 信息管理与工程学院,例7-1. 利用字节流 FileInputStream,FileOutputStream 实现文件复制。例

13、7-2. 利用字符流FileReader,FileWriter实现文件复制。,文件流:例,26,上海财经大学 信息管理与工程学院,管道:用来把一个线程的输出连接到另一个线程的输入 属于节点流 PipedReader/PipedInputStream实现管道的输入端 PipedWriter/PipedOutputStream实现管道的输出端 管道流模型:,常用I/O流(二):管道流,数据传输方向,数据传输方向,27,上海财经大学 信息管理与工程学院,管道由输出端(管道输出流)与管道输入端(管道输入端)连接而成,管道的连接实际是管道的输入流指向管道的输出流,或者输出流指向输入流。 将一个线程的输出

14、流直接挂在另一个线程的输入流, 建立管道,实现线程间数据交换。 PipedInputStream pin= new PipedInputStream( ); PipedOutputStream pout = new PipedOutputStream(pin);PipedInputStream pin= new PipedInputStream( ); PipedOutputStream pout = new PipedOutputStream(); pin.connect(pout); /实现输入输出管道流间的挂接 或pout.connect(pin);,管道流的创建,28,上海财经大学 信

15、息管理与工程学院,Rhymingwords.java,输入一组单词,先将每个单词逆序, 再将所有单词排序,最后将这些单词逆序输出。程序处理流程: Reader rhymedWords = reverse(sort(reverse(words); 分别创建了Reverse,sort, reverse 三个线程,管道流示例,29,上海财经大学 信息管理与工程学院,示例中的管道流,public static Reader reverse(Reader source) throws IOException BufferedReader in = new BufferedReader(source);

16、PipedWriter pipeOut = new PipedWriter(); PipedReader pipeIn = new PipedReader(pipeOut); PrintWriter out = new PrintWriter(pipeOut); new ReverseThread(out, in).start();,在Reverse方法中创建并启动Reverse线程,将管道中的输出流传递给该线程做为其输出流;将管道中的输入流作为返回值传递给Sort方法,作为Sort方法中启动的sort线程的输入流。,30,上海财经大学 信息管理与工程学院,包括:BufferedInputSt

17、ream/BufferedOutputStream; BufferedReader/BufferedWriter; 数据从原始流成块读入或将数据积累到一个大数据块后再成批输出。减少读写次数,提高程序执行效率。 是过滤流,需给出前端(后端)流. 构造方法:public BufferedInputStream(InputStream in);public BufferedInputStream(InputStream in, int size);,常用I/O流(三) :缓存流,31,上海财经大学 信息管理与工程学院,缓存流,BufferedInputStream/BufferedOutputStr

18、eam 基本方法: int read() /读一个字节 int read( byte, int offset, int length ) /读若干字节放入数组int write(int c) void write(byte , int offset, int length ) BufferedReader增加readLine( ) 方法, 读一行字符返回。 见后面标准I/O例7-5,32,上海财经大学 信息管理与工程学院,作用:对于基本数据类型进行有格式的读写 包括DataInputStream和DataOutputStream,属于过滤流 注意:DataOutputStream 与DataI

19、nputStream一般要配套使用 DataInputStream方法byte readByte( ) boolean readBoolean( )long readLong( ) char readChar( )double readDouble( ) float readFloat( )short readshort( ) int readInt( ) DataOutputStream 方法void writeByte(byte) void writeBoolean(boolean)void writeLong( long ) void writeChar(char)void writeD

20、ouble(double) void writeFloat( float)void writeshort(short) void writeInt ( int) void writeBytes(String) void writeChars(String ),常用I/O流(四):数据流,33,上海财经大学 信息管理与工程学院,import java.io.*; 例7-4public class DataIOTest public static void main(String args) throws IOException / 将输出数据流out挂接到文件invoice1.txtDataOu

21、tputStream out = new DataOutputStream(newFileOutputStream(“invoice1.txt“);double prices = 19.99, 9.99, 15.99, 3.99, 4.99 ;int units = 12, 8, 13, 29, 50 ;String descs = “Java T-shirt“,“Java Mug“,“Duke Juggling Dolls“,“Java Pin“,“Java Key Chain“ ;,数据流:示例,34,上海财经大学 信息管理与工程学院,for (int i = 0; i prices.le

22、ngth; i +) out.writeDouble(pricesi);/以double类型写入一个值out.writeChar(t); /以字符形式写入tabout.writeInt(unitsi); /按int类型写入一个值out.writeChar(t);out.writeChars(descsi);out.writeChar(n);out.close(); /关闭输出流/ 将输入数据流in挂接到文件invoice1.txtDataInputStream in = new DataInputStream(newFileInputStream(“invoice1.txt“);double

23、price;int unit;String desc;double total = 0.0;,35,上海财经大学 信息管理与工程学院,try while (true) price = in.readDouble(); /读入输入流中的一个double型数据in.readChar(); / 丢弃 tabunit = in.readInt();in.readChar(); / 丢弃 tabdesc = in.readLine();System.out.println(“Youve ordered “ +unit + “ units of “ +desc + “ at $“ + price);tot

24、al = total + unit * price; catch (EOFException e) System.out.println(“For a TOTAL of: $“ + total);in.close(); ,Youve ordered 12 units of Java T-shirt at $19.99 Youve ordered 8 units of Java Mug at $9.99 Youve ordered 13 units of Duke Juggling Dolls at $15.99 Youve ordered 29 units of Java Pin at $3.

25、99 Youve ordered 50 units of Java Key Chain at $4.99 For a TOTAL of: $892.88,运行结果:,36,上海财经大学 信息管理与工程学院,JAVA系统的标准输入/输出,用于基本系统操作的类System public final class java.lang.System extends java.lang.Object System类所有属性和方法都是静态的,即可以通过使用类名直接调用。,37,上海财经大学 信息管理与工程学院,System类,System类包含三个I/O流成员用于系统标准输入/输出(使用户无需频繁地创建流对

26、象来进行I/O) public static InputStream System.in 用于输入字节数据流,对应标准输入设备键盘 System.in.read() /从键盘读入数据;程序挂起 public static PrintStream System.out 用于输出字节数据流,对应标准输出设备屏幕 System.out.println() /向屏幕输出数据 public static PrintStream System.err 用于输出系统错误信息,对应标准输出设备屏幕,38,上海财经大学 信息管理与工程学院,标准I/O,标准输入System.in.read()从键盘读入一个字符。

27、返回整型值(低位字节是数据,高位为0)。 标准输出 println()方法 Print()方法也可从其它流读入数据。例7-5,39,上海财经大学 信息管理与工程学院,标准文件类: File,File类的对象对应于文件系统中的一个目录或文件; File类用来操纵文件和获得文件的信息,对象描述文件路径、名字、长度、可否读写等属性,可用来命名文件、查询文件属性和处理目录,但不读写文件(由文件流类实现) File类实现文件的管理(创建,删除,更名等),40,上海财经大学 信息管理与工程学院,创建新的文件对象,3种构造方法public File(string pathname) File f1 = ne

28、w File(“c:workmyfile.txt”); /绝对路径 File f2 = new File(“mydirdir1”); /相对路径,移植性较好public File(string parent, string child)mydir= new File(“d:FatherDir”, “SonDir”);参数parent指定了文件或目录的父目录的绝对路径或相对路径,参数child指定了文件或目录名。 public File(File parent, string child)File f3 = new File(f2, “myfile1.txt”); ,文件类:对象的创建,41,上

29、海财经大学 信息管理与工程学院,与文件名有关的操作String getName( )String getAbsolutePath( ) /绝对路径String getPath( ) /相对路径String getParent( )boolean renameTo( File newName)/重命名文件 文件信息测试boolean exists( ) /判断文件是否存在boolean canWrite( )boolean canRead( )boolean isFile( ) boolean isDirectory( ) /判断是否目录boolean isAbsolute( ),文件类:文件测

30、试与实用方法,42,上海财经大学 信息管理与工程学院,文件类:文件测试与实用方法,获取文件一般信息与常用操作 Public long length() Public long lastModified() Public boolean delete()/删除文件或目录 目录操作 Public string list()/将目录中所有文件名称保存在字符数组中返回 Public boolean mkdir(),43,上海财经大学 信息管理与工程学院,例7-6,44,上海财经大学 信息管理与工程学院,随机访问文件: RandomAccessFile类,不属于InputStream/OutputStr

31、eam 用于访问本地文件,可以实现对数据的随机访问(而不是顺序访问) 可读可写 同时实现了DataInput和DataOutput接口,可进行有格式的读写public class RandomAccessFile implements DataInput, DataOutput,45,上海财经大学 信息管理与工程学院,RandomAccessFile类,DataInput接口读取基本类型的数据,或读取一行数据,如:readBoolean( )、readInt( )、readLine( ) 等 DataOutput接口写入基本类型的数据,或写入一定长度的字节数组,如writeChar(),wri

32、teDouble() 等。,46,上海财经大学 信息管理与工程学院,RandomAccessFile类:常用方法,读写文件操作:readXx(),writeXx实现DataInput/Output接口byte readByte() 读一字节char readChar() 读一字符(Unicode码2个字节)double readDouble() 读双精度数(8个字节)readLine () 读一行文本writeChar(), writeInt(),47,上海财经大学 信息管理与工程学院,2种构造方法,创建时指定对应某一文件完成读或写操作RandomAccessFile(String name,

33、 String mode); RandomAccessFile s1=new RandomAccessFile(“a.txt”, “r”);RandomAccessFile(File file, String mode); File f1=new File(“a.txt”); RandomAccessFile s2=new RandomAccessFile(f1, “rw”);,“r”, “rw”,随机存取文件类的创建,“r”以只读方式打开文件;“rw”以读写方式打开文件; rwd, rws,48,上海财经大学 信息管理与工程学院,RandomAccessFile类:常用方法,指针操作long

34、 getFilePointer()返回相对于文件头的位移量(字节)void seek(long pos) 从文件头移动指针(字节)int skipBytesint(int n)移动指针(字节) length() 返回文件长度,49,上海财经大学 信息管理与工程学院,例7-7,50,上海财经大学 信息管理与工程学院,对象的串行化:对java对象的读/写过程 串行化的目的: 实现对象的永久化 定义:把对象(从内存)保存到外存,称为永久化 目的:将对象的状态(变量)以串行格式表示并保存,以便以后需要时重构该对象 远程方法调用(RMI):实现java远程对象间的通讯。 在远程对象的互操作中,有时需要传

35、输对象,对象的串行化(Object Serialization),51,上海财经大学 信息管理与工程学院,对象的串行化:条件,如何进行Object serialization?实现Serializable接口只有实现了Serializable接口的类,其对象才可以被序列化 public abstract interface Serializable Java中定义的标准对象流(均实现了Serializable接口) ObjectOutputStream writeObject( ) ObjectInputStream readObject( ),52,上海财经大学 信息管理与工程学院,对象串行

36、化的方法:对象输出,ObjectOutputStream(过滤流) public final void writeObject(Object obj ) throws IOException 把对象写入对象输出流 例7-8 对象不可串行化时,抛出NotSerializableException异常void writeByte() void writeInt() void writeChar(),53,上海财经大学 信息管理与工程学院,Public class SerializeDate SerializeDate( )Date d = new Date( );try FileOutputStr

37、eam f = new FileOutputStream(“date.ser”);ObjectOutputStream s= new ObjectOutputStream(f); /将对象输出流s挂接到文件输出流f上(最终保存到date.ser文件中)s.writeObject(d); /输出对象f.close( );catch( IOException e)e.printStackTrace( ); public static void main(String args)SerializeDate b = new SerializeDate();System.out.println(“The

38、 saved date is :“+b.d.toString(); ,在java.util中, 实现了Serialization接口,输出对象:例,54,上海财经大学 信息管理与工程学院,对象串行化的方法:对象输入,ObjectInputStream (过滤流) public final object readObject( ) 从对象流中读取对象,例7-9 readByte() readChar() readInt(),55,上海财经大学 信息管理与工程学院,Public class UnSerializeDateUnSerializeDate()Date d = null ;try Fil

39、eInputStream f = new FileInputStream(“date.ser”);ObjectInputStream s = new ObjectInputStream(f); /将对象输入流s挂接到文件输入流f上(即通过f从date.ser 文件读取对象)d = (Date) s.readObject(); /将读入的Object对象强制转换为Date对象f.close();catch(Exception e)e.printStackTrace() ; public static void main(String args)UnSerializeDate a =new UnS

40、erializeDate();System.out.println(“The date read is :“+a.d.toString(); ,输入对象:例,56,上海财经大学 信息管理与工程学院,Q&A,多谢!,57,上海财经大学 信息管理与工程学院,课下练习:上机实验,修改复数程序,主类中使用args命令行参数传入2个复数操作数和1个操作方法(加、减、乘),并编程实现自定义异常LessParamException(操作数不足)与NoOperationException(操作方法未知); 增加定义复数类的复数除方法,用throws声明抛出DividedByZeroException(自定义异常); 在合适的位置处理这些异常。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报