I/O流分类:
- 根据处理的数据类型不同
- 字节流
- 字符流
- 根据流向不同
- 输入流
- 输出流
- 根据功能不同
- 节点流:直接与数据源相连,读入或读出。
- 处理流:直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。
与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。
字符流由来:
因为文件编码的不同,而有了对字符进行高效操作的字符流对象。
原理:其实就是基于字节流读取字节时,去查了指定的码表。
字节流和字符流的区别
1.字节流读取的时候,读到一个字节就返回一个字节。
字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时,先去查指定的码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如图片,mp3,avi
字符流只能处理字符数据。
结论:只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。
下图并不是按照继承关系画的。
1、基本流 FileInputStream和FileOutputStream
节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
将字符串写入特定文件,注意write方法只接收字符数组。
FileOutputStream fos;
try {
fos = new FileOutputStream("test.txt");
fos.write("www.cnblogs.com".getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2、处理流 BufferedInputStream和BufferedOutputStream
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
bos.write("www.cnblogs.com".getBytes());
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3、DataInputStream和DataOutputStream
过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。
try {
FileOutputStream fos = new FileOutputStream("test.txt "); // 获得写入文件功能
BufferedOutputStream bos = new BufferedOutputStream(fos); // 获得缓冲功能
DataOutputStream dos = new DataOutputStream(bos); // 获得写入基本类型功能
byte b = 3;
short s = 4;
int i = 78;
long l = 100000;
char ch = 'a';
boolean bl = false;
float f = 4.5f;
double d = 4.0001;
/*
* 将8种基本类型的对象写入文件中
*/
dos.writeByte(b);
dos.writeShort(s);
dos.writeInt(i);
dos.writeLong(l);
dos.writeChar(ch);
dos.writeBoolean(bl);
dos.writeFloat(f);
dos.writeDouble(d);
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
4、PipedInputStream和PipedOutputStream
管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedStreamDemo {
class Producer extends Thread {
private PipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
@Override
public void run() {
try {
pos.write("hello,I am Producer".getBytes());
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread {
private PipedInputStream pis;
public Consumer(PipedInputStream pis) {
this.pis = pis;
}
public void run() {
try {
byte[] buf = new byte[100];
int len = pis.read(buf);
System.out.println(new String(buf, 0, len));
pis.close(); // 关闭输入流
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
PipedStreamDemo demo = new PipedStreamDemo();
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream();
try {
pos.connect(pis);
// pis.connect(pos); 二选一即可
Producer producer = demo.new Producer(pos);
producer.start();
Consumer consumer = demo.new Consumer(pis);
consumer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
其他的例子我就不一一列举,网上资料很多,或者直接看API,下面主要学习下NIO的知识。