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