流的分类
一、按流的流向来分:
输入流:读取外部的数据输入到程序(读取),由InputStream和Reader作为基类
输出流:将程序的数据写入到外部设备(写入),由OutputStream和Writer作为基类
二、按流的操作数据单元来分:
字符流:操作的数据单元是16为的字符,由Reader和Writer作为基类
字节流:操作的数据单元是8为的字节,由InputSream和OutputStream作为基类
三、按流的角色来分:
节点流:构造器函数是一个物理节点;
处理流:构造器的参数不是一个物理节点,而是一个已经存在的流;
字节流和字符流
一、输入流:
InputStrean(字节)和Reader(字符),都是抽象类,本身不能创建实例,三个共同的方法,以InputStream为例:
int read():读取单个字节,返回读取的字节数据;
int read(byte[] b):从流中读取b.length个字节数据,并将其存储在这个数组b中,返回实际读取的字节个数;
int read(byte[] b , int off , int len):从流中一次读取len个数的字节,并存储在数组b中,存储的位置是从off开始;
因为不能创建实例,所有不能直接new,但是它们都有对应的子类FileInputStream和FileReader。例如:
try {
FileInputStream fi = new FileInputStream("TestJavaIO.java");//创建字节输入流
byte[] bytes = new byte[1204];//创建一个读取数据的字节数组
int number = 0;
while ((number = fi.read(bytes)) > 0){//循环读取
str = new String(bytes);
System.out.print(str + "\n");//打印读取到的数据
}
fi.close();//关闭输入流
} catch (Exception e) {
e.printStackTrace();
}
二、输出流:
OutputStream(字节)和Writer(字符),三个相同的方法:
void write(int c):将指定的字节/字符输出到输出流中;
void write(byte[]/char[] b):将字节数组/字符数组的数据输出到输出流中;
void write(byte[]/char[] b , int off , int len):将字节/字符数组从off开始,长度len的字节/字符输出到输出流中;
Writer还包含:
void write(String str)
void write(String str , int off , int len)
输入/输出流体系
原则:
文本文件使用字符流(文本文件也是一种特殊的二进制文件);二进制文件使用字节流;
一、使用处理流:
使用处理流代替节点流,好处:
① 对开发人员来说,使用处理流进行I/O操作更简单;
② 使用处理流的效率会更高。
例如:往test.txt文件中输入内容:
FileOutputStream fs = new FileOutputStream("test.text");
PrintStream ps = new PrintStream(fs);//输出文本专用流(打印流)
ps.println("执行输出:");
ps.close();
执行完之后,test.txt文件之中会多了内容 "执行输出:" 文字。
二、使用转换流:把字节流转换成字符流(使用方便),InputStreamReader、OutputStreamWriter
//将System.in(键盘输入)对象转换成reader对象
InputStreamReader isr = new InputStreamReader(System.in);
//将普通的reader转换成BufferedReader
BufferedReader reader = new BufferedReader(isr);//方便读取输入流的文本内容
String line = null;
while ((line = reader.readLine()) != null){
System.out.println(line);
}