IO流
一、流的分类
-
输入流:读进程序叫入(read)
-
输出流:写出程序叫出(write)
-
字节流:数据传输中以字节为最小传输单位,类名以InputStream或OutputStream结尾。
-
字符流:以字符为最小传输单位,类名以Reader或Writer结尾。
-
节点流:也称为底层流(直接对应数据的具体来源和目的地,构造参数可以是数据源)
-
包装流:也称为上层流(对底层节点流做包装了,因此不会直接对应数据的具体来源和目的地,因此构造参数为定义好的流)
十五.常用IO流
1、FileInputStream/FileOutputStream
从文件系统中的某个文件中获取/写入字节。用于读取/写入诸如图像数据之类的原始字节流,它的构造方法主要是两个,一个是File 对象作参数,另一个是File名做参数
例:FileOutputStreamos=new FileOutputStream("a. txt");
调用完这句话的时候,就会创建一个a.txt 文件,如果原来已经有了这个文件,则会把原来的删掉,再创建一个新的.如果需要追加,则这样构造:
FileOutputStream os=new FileOutputStream("a. txt", true );
2、DataInputStream/DataOutputStream
DataInputStream 允许应用程序从基础输入流中读取基本Java 数据类型.应用程序可以使用数据输出流写入,稍后由数据输入流读取的数据。
DataOutputStream 允许应用程序将基本Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入。
构造方法的参数为InputStream或OutputStream
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
例:
DataOutputStream dos = new DataOutputStream(new
FileOutputStream("D: \\1 . txt"));
String s = "Hello world";
dos. writeUTF(s);
DataInputStream dis = new DataInputStream(new
FileInputStream("D: \\1 . txt"));
System. out. println(dis. readUTF());
3、ObjectInputStream/ObjectOutputStream
Serializable
概念:
序列化:将数据写入到文件或其它存储介质中
反序列化:从存储介质中读数据
注意事项:
普通类通过实现java.io.Serializable这个标记接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化. 序列化运行时使用serialVersionUID与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类.该字段必须是static final long 类型字段.
有些属性是不需要序列化的,比如网络连接,数据库连接等,这样的属性则可以用transient 修饰。
对象输入输出流ObjectOutputStream 将Java 对象写入输出流. 可以使ObjectInputStream 读取对象. 二者一般与FileOutputStream 和FileInputStream 一起使用,可以为应用程序提供对对象的持久性存储。
ObjectInputStream 对以前使用ObjectOutputStream 写入的基本数据和对象进行反序列化。
只能将实现java.io.Serializable接口的对象写入流中。每个实现此接口的对象的类都被编码,编码内容包括类名、非瞬态(transient 修饰的字段)和非静态字段的值和数组值,以及从初始对象中引用的其他所有对象(对象的序列化可实现深拷贝)。
例如通过ObjectOutputStream 和ObjectInputStream 进行读写:
写入
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("t.tmp"));
oos. writeInt(12345);
oos. writeObject("Today");
oos. writeObject(new Date());
oos. close();
读取
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream("t.tmp"));
int i = ois. readInt();
String today = (String) ois. readObject();
Date date = (Date) ois. readObject();
ois. close();
4、BufferedInputStream/BufferedOutputStream
该类实现缓冲的输出流,是典型的包装流.
注意:被包装得流对象在关流的时候只用关最外边的流.
FileOutputStream fa=new FileOutputStream(“a.txt”);
BufferedOutputStream bos=new BufferedOutputStream(fa);
对于带缓冲的输出流,如果没有关闭的话,需要时刻注意清空缓冲区.如关闭流对象的时候,系统会默认清空缓冲区。
5、InputStreamReader/OutputStreamWriter
InputStreamReader 和OutputStreamWriter 二者搭建了字节流和字符流的桥梁,它们的作用是将字节流包装成字符流
构造方法
InputStreamReader(InputStream is) 采用平台默认字符集
InputStreamReader(InputStream is,String charSetName)
创建使用指定字符集的InputStreamReader。比如:GBK、UTF-8。
6、BufferedReader/BufferedWriter/PrintWriter
构造方法以Reader/Writer 为参数,对Reader/Writer 类进行包装成带缓冲区的类。BufferedReader 中最常用的方法为:String readLine() 读取一个文本行。
使用带缓冲区的流,如果数据输入完毕,使用close方法关闭流并将缓冲区中的内容一次性写入到外部数据源。一定要注意关闭外部的过滤流。其它的输入流用完也一定要close()掉。
例如:
BufferedReader in= newBufferedReader(
newInputStreamReader(System.in));
BufferedReader br = newBufferedReader(
new InputStreamReader (new FileInputStream("")));
二、异常处理
1.异常的分类
1). Throwable:是所有异常的父类,所有的异常均继承于该类。
2). Error:错误,它的出现是不可处理的,一旦出现,我们只能终止程序的运行。
3). Exception:需要我们重点关注,对于这类异常,API定义了许多异常类型。
java语言用继承的方式来组织各种异常。
-
Error
Error是Throwable的子类,它表示系统内部的错误或者资源耗尽。应用程序不应该抛出此种类型的异常,如果出现错误,除了通知用户和结束程序以外,我们没有办法对其进行处理。
3.Exception
1). 未检查异常(运行异常)
继承了RuntimeException的异常,这种异常不用我们显式地声明捕捉。这种异常一般是程序代码上存在不易被发现的逻辑上的错误,如数组下标越界异常(IndexOutOfBoundsException)。
-
. 受检查异常(非运行异常)
直接继承了Exception的异常,这类异常全部为受查异常,在我们调用会抛出受查异常的方法时,必须显式是声明捕捉异常,并对其各种异常作相应的处理。
-
. 异常对象通常有两种构造方法
一种是无参构造方法;另一种是带一个字符串的构造方法,这个字符串将作为这个异常对象除了类型名以外的额外说明。
4.自定义异常
1). 定义未检查异常:
自定义未检查异常需要我们继承RuntimeException,我们一般情况下不用重写所继承的异常类中的方法。
2). 定义受检查异常:
自定义受检查异常需要我们继承Exception,与未检查异常一样,一般也不会重写方法,但是我们可以利用构造方法传入一个异常说明(调用父类构造super(String str))来指示异常发生时的情况。当然,我们也可以直接继承原始父类Throwable,这种异常仍然为受检查异常。
5.处理异常
当异常发生时,我们除了将异常抛给调用者以外,还可以在发生异常的位置直接捕捉,并对其进行处理,这就需要用到异常处理语句。
1). try{}语句
用来包含将要抛出异常的代码,也就是我们常说的对异常的捕捉。
2). catch(Exception e){}语句
用来处理捕捉到的异常,可以显式地声明全部可能抛出的异常的处理,也可以使用他们的统一父类集中处理,但是需要注意,多个catch语句并行时,范围大的异常最后写(也就是说要先处理捕捉到的范围小的异常)。
3). fianlly{}语句
这之中的语句不管异常是否发生,都会被执行(finally中的语句是一定会执行的,即使之前存在return语句)。
4). 综合:
a.一组异常处理语句包含1个try语句,1~n个catch语句和0~1个finally语句。
b.当try语句快中捕捉到异常发生时,会自动调用处理相应异常的catch语句快中的异常处理语句进行异常处理。
c. 程序调用终止的情况:程序员手动终止;程序运行完毕;遇到return语句;发生异常。
5). 异常处理语句的嵌套
像if(){}else{}语句一样,try{}catch(){}finally{}语句同样支持嵌套,但是一般来说try语句块中不会出现多层嵌套。
7.常见异常总结
1). RuntimeException:
2). Exception: