流
流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道。
分类
- 字节流
传输过程中,传输数据的最基本单位是字节的流。字节流的类通常以stream结尾。 - 字符流
传输过程中,传输数据的最基本单位是字符的流。字符流的类通常以reader和writer结尾。
输入字节流 InputStream
- InputStream 是所有的输入字节流的父类,它是一个抽象类。
- ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。
- PipedInputStream 是从与其它线程共用的管道中读取数据。
- ObjectInputStream 和所有FilterInputStream 的子类都是装饰流。BufferedInputStream 是FilterInputStream 的子类,BufferedInputStream 已经提前将数据封装到内存中,内存中操作数据要快,所以它的效率要要非缓冲的要高。
输出字节流 OutputStream
- OutputStream 是所有的输出字节流的父类,它是一个抽象类。
- ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
- PipedOutputStream 是向与其它线程共用的管道中写入数据。
- ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
字符输入流
- Reader是字符输入流的抽象基类.
- InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。
- FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。
- BufferedReader可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。
字符输出流
- Writer是字符输出流的抽象基类。
- OutputStreamWriter可以使我们直接往流中写字符串数据,根据字符编码方式来把字符数据转成字节数据再写给输出流。
- FileWriter与OutputStreamWriter功能类似。
- BufferedWriter利用了缓冲区来提高写的效率。
只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
- 节点流
直接与数据源相连,读入或读出。
(1)父类:InputStream、OutputStream、Reader、Writer
(2)文件:FileInputStream、FileOutputStrean、FileReader、FileWriter 文件进行处理的节点流
(3)数组:ByteArrayInputStream:ByteArrayOutputStream、CharArrayReader、CharArrayWriter 对数组进行处理的节点流
(4)字符串:StringReader、StringWriter 对字符串进行处理的节点流
(5)管道:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter 对管道进行处理的节点流 - 处理流
处理流和节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。
(1)缓冲流:BufferedInputStrean、BufferedOutputStream、BufferedReader、BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
(2)转换流:InputStreamReader、OutputStreamReader实现字节流和字符流之间的转换。
(3)数据流:DataInputStream、DataOutputStream 等。提供将基础数据类型写入到文件中,或者读取出来。
FileInputStream
需要一个文件对象用来实例化,这个文件可以是一个File对象,也可以是文件名路径字符串。
public void test() throws IOexception {
FileInputStream fis = new FileInputStream("a.txt");
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
fis.close();
}
BufferedInputStream
封装别的流以提高效率。
public void test() throws IOexception {
FileInputStream fis = new FileInputStream("a.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
bis.close();
fis.close();
}
FileOutputStream
用于写文件的输出流,所以它需要一个文件作为实例化参数。
public void test() throws IOexception {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write("Hello".getBytes());
fos.close();
}
BufferedOutputStream
需要一个输出流作为实例化参数。
public void test() throws IOexception {
FileOutputStream fos = new FileOutputStream("a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("Hello".getBytes());
bos.close();
fos.close();
}
InputStreamReader
需要一个字节输入流对象作为实例化参数。
public void test() throws IOexception {
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
int ch;
while((ch = isr.read()) != -1) {
System.out.println((char)ch);
}
isr.close();
}
FileReader
需要一个文件对象作为实例化参数.
public void test() throws IOexception {
FileReader reader = new FileReader("a.txt");
char[] buffer = new char[1024];
int len;
while((len = reader.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
reader.close();
}
BufferReader
需要一个字符输入流对象作为实例化参数。
public void test() throws IOexception {
FileReader freader = new FileReader("a.txt");
BufferedReader breader = new BufferedReader(freader);
String line;
while((line = breader.readline()) != null) {
System.out.println(line);
}
breader.close();
freader.close();
}
OutputStreamWriter
需要一个输入流对象作为实例化参数。
public void test() throws IOexception {
OutputStream out = new FileOutputStream("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(out);
osw.write("你好");
osw.close();
}
FileWriter
需要一个文件对象来实例化.
public void test() throws IOexception {
FileWriter writer = new FileWriter("a.txt");
writer.write("你好");
writer.close();
}
BufferWriter
需要一个字符输出流对象作为实例化参数。
public void test() throws IOexception {
FileWriter writer = new FileWriter("a.txt");
BufferWriter bwriter = new BufferWriter(writer);
bwriter.write("你好");
bwriter.close();
writer.close();
}