《java-IO流分析.ppt》由会员分享,可在线阅读,更多相关《java-IO流分析.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本章内容l异常lFilel递归l字节流l转换流l字符流l其他流异常概述l异常:异常就是Java程序在运行过程中出现的错误。l异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。l我们见过的异常,角标越界异常,空指针异常异常分类异常分类图解ThrowableErrorException子类子类RuntimeException子类异常举例异常举例l除数为0l数组访问越界JVM的默认处理方案的默认处理方案l把异常的名称,错误原因及异常出现的位置等信息输出在了控制台l程序停止执行异常处理方案异常处理方案l异常
2、处理方案trycatchfinallythrowstrycatch处理方式l一个异常的情况l多个异常的情况平级情况存在上下级的情况JDK7的新特性及注意事项编译时异常和运行时异常的区别lJava中的异常被分为两大类:编译时异常和运行时异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常l编译时异常Java程序必须显示处理,否则程序就会发生错误,无法通过编译l运行时异常无需显示处理,也可以和编译时异常一样处理Throwable中的方法lgetMessage()获取异常信息,返回字符串。ltoString()获取异常类名和异常信息,返回字符串。lp
3、rintStackTrace()获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。lprintStackTrace(PrintStream s)通常用该方法将异常内容保存在日志文件中,以便查阅。 throwsl定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。l举例分别演示编译时异常和运行时异常的抛出throwl在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。l举例分别演示编译时异常对象和运行时异常对象的抛出throws和throw的区别lthrows用在方法声明后面,跟的是异常类名可以跟多
4、个异常类名,用逗号隔开表示抛出异常,由该方法的调用者来处理throws表示出现异常的一种可能性,并不一定会发生这些异常lthrow用在方法体内,跟的是异常对象名只能抛出一个异常对象名表示抛出异常,由方法体内的语句处理throw则是抛出了异常,执行throw则一定抛出了某种异常 到底该如何处理异常呢到底该如何处理异常呢l原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throwsl区别:后续程序需要继续运行就try后续程序不需要继续运行就throwsl举例:感冒了就自己吃点药就好了,try吃了好几天药都没好结果得了H7N9,那就的得throws到医院如果医院没有
5、特效药就变成Error了finally的特点作用及面试题的特点作用及面试题lfinally的特点被finally控制的语句体一定会执行特殊情况:在执行到finally之前jvm退出了(比如System.exit(0)lfinally的作用用于释放资源,在IO流操作和数据库操作中会见到lfinally相关的面试题final,finally和finalize的区别如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。自定义异常自定义异常l考试成绩必须在0-100之间l很明显java没有对应的异常,需要我们自己来做一个异常l自定义
6、异常继承自Exception继承自RuntimeException异常注意事项异常注意事项l子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)l如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常l如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throwsFile类概述和构造方法lFile类的概述文件和目录路径名的抽象表示形式l构造方法public File(String pathname)public File(String pa
7、rent,String child)public File(File parent,String child)File类的成员方法类的成员方法l创建功能public boolean createNewFile()public boolean mkdir()public boolean mkdirs()l删除功能public boolean delete()l重命名功能public boolean renameTo(File dest)File类的成员方法类的成员方法l判断功能public boolean isDirectory()public boolean isFile()public bo
8、olean exists()public boolean canRead()public boolean canWrite()public boolean isHidden()File类的成员方法类的成员方法l基本获取功能public String getAbsolutePath()public String getPath()public String getName()public long length()public long lastModified()l高级获取功能public String list()public File listFiles()File类练习类练习l判断E盘目
9、录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称l文件名称过滤器的实现思想及代码public String list(FilenameFilter filter)public File listFiles(FilenameFilter filter)查看源码看执行流程递归的思想概述递归的思想概述l递归方法定义中调用方法本身的现象l递归注意实现要有出口,否则就是死递归次数不能太多,否则就内存溢出构造方法不能递归使用递归解决问题的思想及内存图递归解决问题的思想及内存图l递归解决问题的思想找到出口找到规律l求阶乘案例普通for循环递归实现画内存图断点查看执行流程递归练习递归练习l兔子问题(
10、斐波那契数列)l斐波那契数列1,2,3,5,8,13,21,34l(第一项和第二项是1和2,第三项开始,后一项是前两项的和)l递归遍历目录下指定后缀名结尾的文件名称l递归删除带内容的目录IO流概述流概述lIO流用来处理设备之间的数据传输上传文件和下载文件lJava对数据的操作是通过流的方式lJava用于操作流的对象都在IO包中IO流分类流分类l按照数据流向输入流读入数据输出流写出数据l按照数据类型字节流字符流什么情况下使用哪种流呢?如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。如果你什么都不知道,就用字节流IO流常用基类流常用基类l字节流的抽
11、象基类:InputStream ,OutputStream。l字符流的抽象基类:Reader , Writer。l注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。如:InputStream的子类FileInputStream。如:Reader的子类FileReader。字节流写数据字节流写数据lOutputStreamFileOutputStreaml往一个文本文件中写一句话:”helloworld”分析发现其实更适合用字符流,但是由于字节流先出现,所以,我们考虑先使用字节流FileOutputStream的构造方法FileOutputStream(File file)File
12、OutputStream(String name)字节流写数据的方式字节流写数据的方式lpublic void write(int b)lpublic void write(byte b)lpublic void write(byte b,int off,int len)字节流写数据常见问题字节流写数据常见问题l创建字节输出流到底做了哪些事情?l数据写成功后,为什么要close()?l如何实现数据的换行?l如何实现数据的追加写入?字节流写数据加入异常处理字节流写数据加入异常处理l加入异常处理的IO流操作字节流读取数据字节流读取数据lInputStreamFileInputStreaml把刚才写
13、的数据读取出来显示在控制台lFileInputStream的构造方法FileInputStream(File file)FileInputStream(String name)lFileInputStream的成员方法public int read()public int read(byte b)字节流读取数据两种方式图解比较字节流读取数据两种方式图解比较l一次读取一个字节l一次读取一个字节数组每次可以读取多个数据,提高了操作效率字节流复制数据练习字节流复制数据练习l把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中l把c:a.txt内容复制到d:b.txt中l把e:林青霞.j
14、pg内容复制到当前项目目录下的mn.jpg中l把e:蝴蝶飞呀.mp3复制到当前项目目录下的copy.mp4中字节缓冲流字节缓冲流l字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流l字节缓冲输出流BufferedOutputStreaml字节缓冲输入流BufferedInputStream字节缓冲流复制数据练习字节缓冲流复制数据练习l把d:demo16.jpg内容复制到当前项目目录下的mn.jpg中l把d:童年.mp4复制到当前项目目录下的copy.m
15、p4中l四种方式比较复制效率转换流出现的原因及思想转换流出现的原因及思想l由于字节流操作中文不是特别方便,所以,java就提供了转换流。l字符流=字节流+编码表。编码表概述和常见的编码表编码表概述和常见的编码表l编码表由字符及其对应的数值组成的一张表l常见编码表ASCII/Unicode 字符集ISO-8859-1GB2312/GBK/GB18030BIG5UTF-8字符串中的编码问题字符串中的编码问题l编码把看得懂的变成看不懂的l解码把看不懂的变成看得懂的转换流概述转换流概述lOutputStreamWriter 字符输出流public OutputStreamWriter(OutputSt
16、ream out)public OutputStreamWriter(OutputStream out,String charsetName)lInputStreamReader 字符输入流public InputStreamReader(InputStream in)public InputStreamReader(InputStream in,String charsetName)OutputStreamWriter写数据lOutputStreamWriter写数据方法public void write(int c)public void write(char cbuf)public vo
17、id write(char cbuf,int off,int len)public void write(String str)public void write(String str,int off,int len)l字符流操作要注意的问题flush()的作用flush()和close()的区别InputStreamReader读数据lOutputStreamWriter读数据方法public int read()public int read(char cbuf)字符流复制文本文件字符流复制文本文件l把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中l把c:a.txt内容复
18、制到d:b.txt中转换流的简化写法转换流的简化写法l转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。lFileWriterlFileReaderFileWriter和和FileReaderlFileWriter写数据lFileReader读取数据lFileWriter和FileReader实现文本文件的复制字符缓冲流字符缓冲流lBufferedWriter基本用法lBufferedReader基本用法l字符缓冲流复制文本文件l特殊功能BufferedWritervoid newLine()BufferedReaderStrin
19、g readLine()l字符缓冲流特殊功能复制文本文件IO流小结流小结l字节流字节输入流字节输出流l字符流字符输入流字符输出流IO流练习流练习l复制文本文件l复制图片l把ArrayList集合中的字符串数据存储到文本文件l从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合l复制单极文件夹l复制单极文件夹中指定文件并修改文件名称l复制多极文件夹l键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低存入文本文件IO流练习流练习l已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排
20、序后写入ss.txt中。l用Reader模拟BufferedReader的readLine()功能l自定义类模拟LineNumberReader的特有功能获取每次读取数据的行号l登录注册IO版操作基本数据类型的流l操作基本数据类型DataInputStreamDataOutputStream内存操作流内存操作流l操作字节数组ByteArrayInputStreamByteArrayOutputStreaml操作字符数组CharArrayReaderCharArrayWritel操作字符串StringReaderStringWriter打印流打印流l打印流概述字节流打印流字符打印流l打印流特点只
21、能操作目的地,不能操作数据。可以操作任意类型的数据。如果启动了自动刷新,能够自动刷新。可以操作文件的流l打印流复制文本文件标准输入输出流标准输入输出流lSystem类中的字段:in,out。l它们各代表了系统标准的输入和输出设备。l默认输入设备是键盘,输出设备是显示器。lSystem.in的类型是InputStream.lSystem.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.随机访问流随机访问流lRandomAccessFile概述RandomAccessFile类不属于流,是Object类的子类。但它融合了InputS
22、tream和OutputStream的功能。支持对随机访问文件的读取和写入。l案例演示合并流合并流lSequenceInputStream概述SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。lSequenceInputStream的构造方法SequenceInputStream(InputStream s1, InputStream s2) SequenceInputStream(Enumeration e)把多个文件的内容写入到一个文本文件序列化流序列化流l序列化流ObjectOutputStreaml反序列化流ObjectIn
23、putStreaml序列化操作问题为什么要实现序列化?如何实现序列化?序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?使用transient关键字声明不需要序列化的成员变量Properties集合集合lProperties概述lProperties作为Map集合的使用lProperties的特殊功能public Object setProperty(String key,String value)public String getProperty(String key)public Set stringPropertyNames()lProperties和IO流的结合使用public void load(Reader reader)public void store(Writer writer,String comments)NIO包下的包下的IO流流lNIO其实就是新IO的意思。JDK4出现NIO。新IO和传统的IO有相同的目的,都是用于进行输入输出的,但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多,但是目前好多地方我们看到的还是旧IO的引用,所以我们仍以旧IO为主,知道NIO即可。JDK7的IO改进(写一个案例)PathPathsFiles
限制150内