• 1. 北京传智播客教育 www.itcast.cnAPI-IO传智风清扬
  • 2. 本章内容北京传智播客教育 www.itcast.cn异常 File 递归 字节流 转换流 字符流 其他流
  • 3. 异常概述异常:异常就是Java程序在运行过程中出现的错误。 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。 我们见过的异常,角标越界异常,空指针异常北京传智播客教育 www.itcast.cn
  • 4. 异常分类异常分类图解北京传智播客教育 www.itcast.cnThrowableErrorException子类子类RuntimeException子类
  • 5. 异常举例除数为0 数组访问越界北京传智播客教育 www.itcast.cn
  • 6. JVM的默认处理方案把异常的名称,错误原因及异常出现的位置等信息输出在了控制台 程序停止执行北京传智播客教育 www.itcast.cn
  • 7. 异常处理方案异常处理方案 try…catch…finally throws北京传智播客教育 www.itcast.cn
  • 8. try…catch处理方式一个异常的情况 多个异常的情况 平级情况 存在上下级的情况 JDK7的新特性及注意事项北京传智播客教育 www.itcast.cn
  • 9. 编译时异常和运行时异常的区别Java中的异常被分为两大类:编译时异常和运行时异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常 编译时异常 Java程序必须显示处理,否则程序就会发生错误,无法通过编译 运行时异常 无需显示处理,也可以和编译时异常一样处理 北京传智播客教育 www.itcast.cn
  • 10. Throwable中的方法getMessage() 获取异常信息,返回字符串。 toString() 获取异常类名和异常信息,返回字符串。 printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。 printStackTrace(PrintStream s) 通常用该方法将异常内容保存在日志文件中,以便查阅。 北京传智播客教育 www.itcast.cn
  • 11. throws定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。 举例分别演示编译时异常和运行时异常的抛出 北京传智播客教育 www.itcast.cn
  • 12. throw在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。 举例分别演示编译时异常对象和运行时异常对象的抛出 北京传智播客教育 www.itcast.cn
  • 13. throws和throw的区别throws 用在方法声明后面,跟的是异常类名 可以跟多个异常类名,用逗号隔开 表示抛出异常,由该方法的调用者来处理 throws表示出现异常的一种可能性,并不一定会发生这些异常 throw 用在方法体内,跟的是异常对象名 只能抛出一个异常对象名 表示抛出异常,由方法体内的语句处理 throw则是抛出了异常,执行throw则一定抛出了某种异常  北京传智播客教育 www.itcast.cn
  • 14. 我们到底该如何处理异常呢原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws 区别: 后续程序需要继续运行就try 后续程序不需要继续运行就throws 举例: 感冒了就自己吃点药就好了,try 吃了好几天药都没好结果得了H7N9,那就的得throws到医院 如果医院没有特效药就变成Error了北京传智播客教育 www.itcast.cn
  • 15. finally的特点作用及面试题finally的特点 被finally控制的语句体一定会执行 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0)) finally的作用 用于释放资源,在IO流操作和数据库操作中会见到 finally相关的面试题 final,finally和finalize的区别 如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。北京传智播客教育 www.itcast.cn
  • 16. 自定义异常考试成绩必须在0-100之间 很明显java没有对应的异常,需要我们自己来做一个异常 自定义异常 继承自Exception 继承自RuntimeException 北京传智播客教育 www.itcast.cn
  • 17. 异常注意事项子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏) 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws 北京传智播客教育 www.itcast.cn
  • 18. File类概述和构造方法File类的概述 文件和目录路径名的抽象表示形式 构造方法 public File(String pathname) public File(String parent,String child) public File(File parent,String child) 北京传智播客教育 www.itcast.cn
  • 19. File类的成员方法创建功能 public boolean createNewFile() public boolean mkdir() public boolean mkdirs() 删除功能 public boolean delete() 重命名功能 public boolean renameTo(File dest)北京传智播客教育 www.itcast.cn
  • 20. File类的成员方法判断功能 public boolean isDirectory() public boolean isFile() public boolean exists() public boolean canRead() public boolean canWrite() public boolean isHidden()北京传智播客教育 www.itcast.cn
  • 21. File类的成员方法基本获取功能 public String getAbsolutePath() public String getPath() public String getName() public long length() public long lastModified() 高级获取功能 public String[] list() public File[] listFiles()北京传智播客教育 www.itcast.cn
  • 22. File类练习判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称 文件名称过滤器的实现思想及代码 public String[] list(FilenameFilter filter) public File[] listFiles(FilenameFilter filter) 查看源码看执行流程北京传智播客教育 www.itcast.cn
  • 23. 递归的思想概述递归 方法定义中调用方法本身的现象 递归注意实现 要有出口,否则就是死递归 次数不能太多,否则就内存溢出 构造方法不能递归使用 北京传智播客教育 www.itcast.cn
  • 24. 递归解决问题的思想及内存图递归解决问题的思想 找到出口 找到规律 求阶乘案例 普通for循环 递归实现 画内存图 断点查看执行流程 北京传智播客教育 www.itcast.cn
  • 25. 递归练习兔子问题(斐波那契数列) 递归遍历目录下指定后缀名结尾的文件名称 递归删除带内容的目录 北京传智播客教育 www.itcast.cn
  • 26. IO流概述IO流用来处理设备之间的数据传输 上传文件和下载文件 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中北京传智播客教育 www.itcast.cn
  • 27. IO流分类按照数据流向 输入流 读入数据 输出流 写出数据 按照数据类型 字节流 字符流 什么情况下使用哪种流呢? 如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。 如果你什么都不知道,就用字节流北京传智播客教育 www.itcast.cn
  • 28. IO流常用基类字节流的抽象基类: InputStream ,OutputStream。 字符流的抽象基类: Reader , Writer。 注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。 如:InputStream的子类FileInputStream。 如:Reader的子类FileReader。北京传智播客教育 www.itcast.cn
  • 29. 字节流写数据OutputStream FileOutputStream 往一个文本文件中写一句话:”helloworld” 分析发现其实更适合用字符流,但是由于字节流先出现,所以,我们考虑先使用字节流后面再讲会什么出现字符流。 FileOutputStream的构造方法 FileOutputStream(File file) FileOutputStream(String name)北京传智播客教育 www.itcast.cn
  • 30. 字节流写数据的方式public void write(int b) public void write(byte[] b) public void write(byte[] b,int off,int len) 北京传智播客教育 www.itcast.cn
  • 31. 字节流写数据常见问题创建字节输出流到底做了哪些事情? 数据写成功后,为什么要close()? 如何实现数据的换行? 如何实现数据的追加写入?北京传智播客教育 www.itcast.cn
  • 32. 字节流写数据加入异常处理加入异常处理的IO流操作北京传智播客教育 www.itcast.cn
  • 33. 字节流读取数据InputStream FileInputStream 把刚才写的数据读取出来显示在控制台 FileInputStream的构造方法 FileInputStream(File file) FileInputStream(String name) FileInputStream的成员方法 public int read() public int read(byte[] b) 北京传智播客教育 www.itcast.cn
  • 34. 字节流读取数据两种方式图解比较一次读取一个字节 一次读取一个字节数组 每次可以读取多个数据,提高了操作效率北京传智播客教育 www.itcast.cn
  • 35. 字节流复制数据练习把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 把c:\\a.txt内容复制到d:\\b.txt中 把e:\\林青霞.jpg内容复制到当前项目目录下的mn.jpg中 把e:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中北京传智播客教育 www.itcast.cn
  • 36. 字节缓冲流字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流 字节缓冲输出流 BufferedOutputStream 字节缓冲输入流 BufferedInputStream北京传智播客教育 www.itcast.cn
  • 37. 字节缓冲流复制数据练习把d:\\林青霞.jpg内容复制到当前项目目录下的mn.jpg中 把d:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中 四种方式比较复制效率北京传智播客教育 www.itcast.cn
  • 38. 转换流出现的原因及思想由于字节流操作中文不是特别方便,所以,java就提供了转换流。 字符流=字节流+编码表。 北京传智播客教育 www.itcast.cn
  • 39. 编码表概述和常见的编码表编码表 由字符及其对应的数值组成的一张表 常见编码表 ASCII/Unicode 字符集 ISO-8859-1 GB2312/GBK/GB18030 BIG5 UTF-8 北京传智播客教育 www.itcast.cn
  • 40. 字符串中的编码问题编码 把看得懂的变成看不懂的 解码 把看不懂的变成看得懂的 北京传智播客教育 www.itcast.cn
  • 41. 转换流概述OutputStreamWriter 字符输出流 public OutputStreamWriter(OutputStream out) public OutputStreamWriter(OutputStream out,String charsetName) InputStreamReader 字符输入流 public InputStreamReader(InputStream in) public InputStreamReader(InputStream in,String charsetName) 北京传智播客教育 www.itcast.cn
  • 42. OutputStreamWriter写数据OutputStreamWriter写数据方法 public void write(int c) public void write(char[] cbuf) public void write(char[] cbuf,int off,int len) public void write(String str) public void write(String str,int off,int len) 字符流操作要注意的问题 flush()的作用 flush()和close()的区别北京传智播客教育 www.itcast.cn
  • 43. InputStreamReader读数据OutputStreamWriter读数据方法 public int read() public int read(char[] cbuf)北京传智播客教育 www.itcast.cn
  • 44. 字符流复制文本文件把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 把c:\\a.txt内容复制到d:\\b.txt中北京传智播客教育 www.itcast.cn
  • 45. 转换流的简化写法转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。 FileWriter FileReader北京传智播客教育 www.itcast.cn
  • 46. FileWriter和FileReaderFileWriter写数据 FileReader读取数据 FileWriter和FileReader实现文本文件的复制北京传智播客教育 www.itcast.cn
  • 47. 字符缓冲流BufferedWriter基本用法 BufferedReader基本用法 字符缓冲流复制文本文件 特殊功能 BufferedWriter void newLine() BufferedReader String readLine() 字符缓冲流特殊功能复制文本文件北京传智播客教育 www.itcast.cn
  • 48. IO流小结字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流北京传智播客教育 www.itcast.cn
  • 49. IO流练习复制文本文件 复制图片 把ArrayList集合中的字符串数据存储到文本文件 从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合 复制单极文件夹 复制单极文件夹中指定文件并修改文件名称 复制多极文件夹 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低存入文本文件北京传智播客教育 www.itcast.cn
  • 50. IO流练习已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中。 用Reader模拟BufferedReader的readLine()功能 自定义类模拟LineNumberReader的特有功能 获取每次读取数据的行号 登录注册IO版北京传智播客教育 www.itcast.cn
  • 51. 操作基本数据类型的流操作基本数据类型 DataInputStream DataOutputStream北京传智播客教育 www.itcast.cn
  • 52. 内存操作流操作字节数组 ByteArrayInputStream ByteArrayOutputStream 操作字符数组 CharArrayReader CharArrayWrite 操作字符串 StringReader StringWriter北京传智播客教育 www.itcast.cn
  • 53. 打印流打印流概述 字节流打印流 字符打印流 打印流特点 只能操作目的地,不能操作数据。 可以操作任意类型的数据。 如果启动了自动刷新,能够自动刷新。 可以操作文件的流 打印流复制文本文件北京传智播客教育 www.itcast.cn
  • 54. 标准输入输出流System类中的字段:in,out。 它们各代表了系统标准的输入和输出设备。 默认输入设备是键盘,输出设备是显示器。 System.in的类型是InputStream. System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.北京传智播客教育 www.itcast.cn
  • 55. 随机访问流RandomAccessFile概述 RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。 案例演示 北京传智播客教育 www.itcast.cn
  • 56. 合并流SequenceInputStream概述 SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。 SequenceInputStream的构造方法 SequenceInputStream(InputStream s1, InputStream s2) SequenceInputStream(Enumeration e) 把多个文件的内容写入到一个文本文件北京传智播客教育 www.itcast.cn
  • 57. 序列化流序列化流 ObjectOutputStream 反序列化流 ObjectInputStream 序列化操作问题 为什么要实现序列化? 如何实现序列化? 序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢? 使用transient关键字声明不需要序列化的成员变量 北京传智播客教育 www.itcast.cn
  • 58. Properties集合Properties概述 Properties作为Map集合的使用 Properties的特殊功能 public Object setProperty(String key,String value) public String getProperty(String key) public Set stringPropertyNames() Properties和IO流的结合使用 public void load(Reader reader) public void store(Writer writer,String comments)北京传智播客教育 www.itcast.cn
  • 59. NIO包下的IO流NIO其实就是新IO的意思。 JDK4出现NIO。新IO和传统的IO有相同的目的,都是用于进行输入输出的,但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多,但是目前好多地方我们看到的还是旧IO的引用,所以我们仍以旧IO为主,知道NIO即可。 JDK7的IO改进(写一个案例) Path Paths Files北京传智播客教育 www.itcast.cn