IO流(二)和异常处理

来源:互联网 发布:大连华天软件 编辑:程序博客网 时间:2024/05/16 11:56

IO流(二)
1. 流的分类
1.1 按流的流向分类
输入流和输出流
输入流是从其他地方(硬盘、外部存储、网络等)往内存中读取数据。
输出流是从内存往其他地方(硬盘、外部存储、网络等)写入数据。
输入和输出流的方向是相对于内存而言的
1.2 按流的传输单位分类
字节流和字符流
字节流是基于8位的字节作为操作的数据单元。
字符流是基于16位的字符作为操作的数据单元。
字符流可以看成特殊的字节流
1.3 按功能分类
节点流和处理流
直接从数据源读/写数据的流,称为节点流。
对一个已经存在的流进行连接封装,通过封装后的流来实现数据读/写功能,即为处理流。
2. 流的基类
2.1 InputStream
2.1.1 InputStream简介
InputSteam是字节输入流的抽象基类,本身不能创建实例来进行输入,但是有丰富的子类去实现不同的功能,它类似于一个模板,所以它的方法将是所有输入流都可使用的方法
2.1.2 InputStream常用方法
● int read(); 从输入流中读取单个字节,返回所读取的字节数据,转化成为int类型
● int read(byte[] b); 从输入流中最多读取字节数组b的长度个字节数据,并且保存在b中,返回值表示本次读取实际读取的字节数
● int read(byte[] b, int off, int len); 从输入流中最多读取len个字节的数据,并存储在字节数组b中,并不是从数组的开头放入的,而是从off位置开始,返回实际读取的字节数
● void close(); 关闭此输入流并释放与此流关联的所有系统资源
● long skip(long n); 跳过和丢弃此输入流中数据的 n 个字节,返回实际跳过的字节数
2.2 OutputStream
2.2.1 OutputStream简介
OutputStream是所有字节输出流的抽象父类,和InputStream是对应的,它也有自己的一系列方法
2.2.2 OutputStream常用方法
● void write(int c); 将指定的字节输出到输出流中
● void write(byte[] b); 将字节数组中的数据输出到指定的输出流中
● void write(byte[] b, int off, int len); 将字节数组中的off位置开始,长度为len的字节输出到输出流中
2.3 Reader
2.3.1 Reader简介
Reader是字符输入流的抽象基类,和InputStream的用法非常相似,唯一的区别在于对字节的操作变成了对字符的操作
2.3.2 Reader常用方法
● int read(); 从输入流中读取单个字符,返回所读取的字符数据,转化为int类型
● int read(char[] c); 从输入流中最多读取字符数组c的长度个字符数据,并且保存在c中,返回值表示本次读取实际读取的字符数
● int read(char[] c, int off, int len); 从输入流中最多读取len个字符的数据,并存储在字符数组c中,
并不是从数组的开头放入的,而是从off位置开始,返回实际读取的字符数
● void close(); 关闭此输入流并释放与此流管理的所有系统资源
● long skip(long n); 跳过输入流中的n个字符,返回实际跳过的字符数
2.4 Writer
2.4.1 Writer简介
Writer是字符输出流,和Reader是对应的,基本用法和OutputStream类似,但是因为字符流直接以字符作为操作单位,所以Writer相对于字节输出流还多了几个方法
2.4.2 Writer常用方法
● void write(int c); 将指定的字符输出到输出流中
● void write(char[] c); 将字符数组中的数据输出到指定的输出流中
● void write(char[] c, int off, int len); 将字符数组中从off开始,长度为len的字符数据输出到输出流中
● void write(String str); 将str字符串里包含的字符输出到指定的输出流中
● void write(String str, int off, int len); 将str字符串里从off位置开始,长度为len的字符输出到输出流中
3. 常用的流的实现类
3.1 文件流
● FileInputStream类
● FileOutputStream类 输出流可以创建新文件,不可以新建目录,默认情况下,每个输出流对象都是全覆盖的写入内容,如果方法的第二个参数是true,就会追加的写入内容,而不是覆盖。
● FileReader类
● FileWriter类
3.2 内存流
● ByteArrayInputStream类
● ByteArrayOutputStream类
● CharArrayReader类
● CharArrayWriter类
● StringReader类
● StringWriter类
3.3 缓冲流
● BufferedReader类(新增了readLine()方法用于一次读取一行字符串(以‘\r’或‘\n’认为一行结束))
● BufferedWriter类(新增了newLine()方法用于写出一个行分隔符)
● 注意
对于缓冲输出流,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据立刻写出。关闭过滤流时,会自动关闭过滤流所包装的所有底层流
3.4 打印流
● PrintStream类
● PrintWriter类
3.5 转换流
● InputSreamReader类
● OutputStreamWriter类
3.6 对象流
● ObjectInputStream类
● ObjectOutputStream类
4. 随机访问类
4.1 RandomAccessFile类
主要功能是完成随机读写功能,可以读取指定位置的内容
4.2 构造方法
public RandomAccessFile (File file,String mode)
public RandomAccessFile (String name,String mode)
第二个参数:文件的打开模式(mode):
“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
4.3 常用方法
● void seek(long pos)设置文件指针偏移量,在该位置准备开始读写。
● long getFilePointer()获取此文件中的当前偏移量
● long length()返回此文件的长度。
● int skipBytes(int n)尝试跳过输入的 n 个字节并丢弃跳过的字节.返回实际跳过的字节数.
5. 注意
● 当一个文件可以用记事本打开并且正常显示,我们就可以用字符流来处理,也可以直接用字节流处理,其实字符流就是特殊的字节流
● 使用IO流切记需要关闭流,释放资源
异常处理
1. 什么是异常处理?
异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。
2. 异常的分类
2.1受检异常
编译器要求必须处理的异常。指的是程序在运行时由于外界因素造成的一般性异常。
没有找到指定名称的类:java.lang.ClassNotFoundException
访问不存在的文件:java.io.FileNotFoundException
操作文件时发生的异常:java.io.IOException
操作数据库时发生的异常:java.sql.SQLException
2.2 非受检异常(运行时异常)
编译器不要求必须处理的异常。
一般是指编程时的逻辑错误。是程序员应该积极避免其出现的异常
java.lang.RuntimeException及它的子类都是非受检异常:
错误的类型转换:java.lang.ClassCastException
数组下标越界:java.lang.ArrayIndexOutOfBoundsException
空指针访问:java.lang.NullPointerException
算术异常(除0溢出):java.lang.ArithmeticException
3. 异常处理机制
3.1 try…catch捕获异常
1、一旦产生异常,则首先会产生一个异常类的对象;
2、在try语句中对此异常对象进行捕捉;
3、产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码;
3.2 访问异常信息
getMessage() 方法,用来获得有关异常事件的字符串信息。
printStackTrace() 方法,用来跟踪异常事件发生时执行堆栈的内容。
3.3 使用finally回收资源
finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。
通常在finally语句块中可以进行资源的清理工作,如:
关闭打开的文件
删除临时文件
关闭数据库的连接等
3.4 注意
● 使用多重 catch 语句时,异常子类一定要位于异常父类之前。
● 如果没有异常产生,所有的catch段的代码都会被忽略不执行。
● 无论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。
● finally语句是可选的,如果写了finally语句,可以没有catch语句
4.异常的抛出
● 在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理。
● throw关键字 (throw关键字用在方法代码中主动抛出一个异常)
● throws关键字 ( throws用来声明一个方法可能会抛出的所有异常。跟在方法签名的后面)