大多数应用程序都需要实现与设备之间的数据传输。在Java中,将通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象描述为”流”。
Java中的流都位于 java.io 包中,称为IO(输入输出)流。
1.字节流
1.1 字节流的概念
在计算机中,无论是文本、图片、音频还是视频,所有的文件都是以二进制(字节)形式存在的。IO流中针对字节的输入输出提供了一系列的流,统称为字节流。
在JDK中,提供了两个抽象类 InputStream 和 OutputStream ,他们是字节流的顶级父类,所有的字节输入流都继承自 InputStream ,所有的字节输出流都继承自 OutputStream 。
1.2 字节流读写文件
针对文件的独写,JDK专门提供了两个类,分别是 FileInputStream 和 FileOutputStream 。
FileInputStream 是 InputStream 的子类,它是操作文件的字节输入流,专门用于读取文件中的数据。
FileOutputStream 是 OutputStream 的子类,它是操作文件的字节输出流,专门用于把数据写入文件。
1.3 字节流的缓冲区
主要代码:1
2
3
4
5byte[] buff = new byte[1024];
int len;
while((len=in.read(buff))!=-1){
out.write(buff,0,len)
}
上述代码实现了用缓冲区来拷贝文件。首先定义了一个字节数组,作为缓冲区。字节数组被填满后,执行写入,把字节数组里的内容全部写入。最后输出流关闭时,也会执行写入,可以防止数组里没有写满的没有写入文件。
1.4 字节缓冲流
在IO包中提供两个带缓冲的字节流,分别是 BufferedInputStream 和 BufferedOutputStream 。
简单理解就是,自带了缓冲区的字节流。
使用方法,把类包装起来。主要代码如下:BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.txt"));
就这样包起来,所以也叫包装流。
2.字符流
InputStream 类和 OutputStream 类在读写文件时操作的都是字节。同样,JDK也提供了字符流,用来操作字符。
Reader 和 Writer 分别是两个抽象的顶级父类。Reader是字符输入流,用与读取字符。Writer是字符输出流,用于写入字符。
2.1 字符流操作文件
FileReader 是 Reader 的子类,可以读取一个或一组字符。
FileWriter 是 Writer 的子类,用于写入字符。
同字节缓冲流一样,字符也有字符缓冲流 BufferedReader 和 BufferedWriter 。操作方法也一样。
需要注意的是,BufferedWriter 中的一个重要方法 readLine(),和 FileOutputStream 里的 read(),用法一样,区别是read()一次读取一个字节,而readLine()一次读取一行字符。需要注意。
2.2 转换流
字节流和字符流之间可以互相转换。利用 InputStreamReader 和 OutputStreamWriter 这两个类进行转换。
转换流其实也是一种包装流,其中 OutputStreamWriter 是 Writer 的子类,InputStreamReader 是 Reader 的子类。
用的时候包装一下就可以了,和上面两个缓冲流用法一样。
3.其他流
3.1 ObjectInputStream 和 ObjectOutputStream
程序运行时,会创建对象,程序结束后,这些对象会被垃圾回收。如果希望永久保存这些对象,则可以将对象转为字节数据写入硬盘,这个过程叫对象序列化。
JDK提供了 ObjectOutputStream 来实现序列化, ObjectInputStream 用来反序列化。
当对象序列化时,必须保证对象实现了Serializable接口,否则程序会报错。