#java 流类图结构:
##一、 流的分类
-
按数据流的方向不同:输入流,输出流。
-
按处理数据单位不同:字节流(InputStream,OutputStream),字符流(Reader,Writer)。
(1) 字节流:数据流中最小的数据单元是字节。
(2) 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。 -
按功能不同:节点流,处理流。
(1)程序用于直接操作目标设备所对应的类叫节点流。
(2)程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流。
##二、节点流
###1. 节点流的类型
(1)File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream。
(2)Memory
[1]从/向内存数组读写数据: CharArrayReader与 CharArrayWriter、 ByteArrayInputStream与ByteArrayOutputStream。
[2]从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream。
(3)Pipe管道流。 实现管道的输入和输出(进程间通信): PipedReader与PipedWriter、PipedInputStream与PipedOutputStream。
####字节文件流:package com.senior.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;public class FileInputStream_FileOutputStream {
public static void main(String[] args) {
InputStream input = null;
OutputStream output = null;
try {
File file = new File(“file/file.txt”);
input = new FileInputStream(file); //没有该文件会FileNotFoundException抛异常
//FileOutputStream(String name,boolean append) append:是否可以追加文件
output = new FileOutputStream(“file/file1.txt”,true); //没有该文件会自动创建
byte[] b = new byte[3];
int count = -1;
while((count = input.read(b)) != -1) {
System.out.println(Arrays.toString(b));
output.write(b, 0, count);
}
output.flush(); //强制刷新暂存区,将所有字节强制输出
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (output !=null){
try {
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (input != null) {
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
####字符文件流:package com.senior.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;public class Reader_Writer {
public static void main(String[] args) {
Reader reader = null;
Writer writer = null;
try {
File file = new File(“file/file.txt”);
reader = new FileReader(file);
writer = new FileWriter(“file/file1.txt”);char[] ch = new char[3]; int count = -1; while ((count = reader.read(ch)) != -1) { System.out.println(Arrays.toString(ch)+" " +count); writer.write(ch, 0, count); } writer.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } }
}
###2. 节点流执行的图示
三、处理流
- 处理流的类型
-(1)Buffering缓冲流:在读入或写出时,对数据进行缓存,以减少I/O的次数:BufferedReader与BufferedWriter、BufferedInputStream与BufferedOutputStream。
- (2)Filtering 滤流:在数据进行读或写时进行过滤:FilterReader与FilterWriter、FilterInputStream与FilterOutputStream。
- (3)Converting between Bytes and Characters 转换流:按照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader):InputStreamReader、OutputStreamWriter。
- (4)Object Serialization 对象流 :ObjectInputStream、ObjectOutputStream。
- (5)DataConversion数据流: 按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream 。
- (6)Counting计数流: 在读入数据时对行记数 :LineNumberReader、LineNumberInputStream。
- (7)Peeking Ahead预读流: 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream。
- (8)Printing打印流: 包含方便的打印方法 :PrintWriter、PrintStream。
- 处理流执行的图示
- 缓冲流
【1】对I/O进行缓冲是一种常见的性能优化,缓冲流为I/O流增加了内存缓冲区,增加缓冲区的两个目的:
(1)允许Java的I/O一次不只操作一个字符,这样提高䇖整个系统的性能;
(2)由于有缓冲区,使得在流上执行skip、mark和reset方法都成为可能。
【2】缓冲流:它是要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,
提高了读写的效率,同时增加了一些新的方法。例如:BufferedReader中的readLine方法,BufferedWriter中的newLine方法
4. 转换流
转换流有两种:
(1)InputStreamReader:将字节流转换为字符流;
(2)OutputStreamWriter:将字符流转换为字节流。
5. 数据流
数据流:DataInputStream和DataOutputStream
(1)DataInputStream和DataOutputStream是面向字节的,因此要使用InputStream和OutputStream。
(2)DataInputStream和DataOutputStream分别继承InputStream和OutputStream,
它们属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。
(3)DataInputStream和DataOutputStream提供了可以存取与机器无关的Java原始类数据(如:int,double等)的方法。
(4)DataInputStream和DataOutputStream的构造方法:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)