目录
IO流的分类
- 根据处理数据类型的不同分为:字符流和字节流
- 根据数据流向不同分为:输入流和输出流
四大基流:
- 字节输出流OutPutStream
- 字节输入流InPutStream
- 字符输出流Writer
- 字符输入流Reader
四大基流都是抽象类: 其他流都是继承于这四大基流的
我们不能创建四大基流的对象,只能创建其子类对象
字节流和字符流的区别
- 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节
- 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据
- 字节流:一次读入或读出是8位二进制
- 字符流:一次读入或读出是16位二进制
输入字节流 InputStream
- InputStream 是所有的输入字节流的父类,它是一个抽象类
- ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据
- PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍
- bjectInputStream 和所有FilterInputStream
输出字节流 OutputStream
- OutputStream 是所有的输出字节流的父类,它是一个抽象类
- ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据
- PipedOutputStream 是向与其它线程共用的管道中写入数据
- ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流
总结 - 输入流:InputStream或者Reader:从文件中读到程序中
- 输出流:OutputStream或者Writer:从程序中输出到文件中
输入字符流FileReader
字符输入流的处理类为Reader。Reader类的定义结构如下:
public abstract class Reader implements Readable, Closeable
Reader也是一个抽象类,如果要进行文件的读取,也要用到它的间接子类FileReader
。
Reader中也提供了一些方法,读取文件内容:
public int read() throws IOException
public int read(char cbuf[]) throws IOException
abstract public int read(char cbuf[], int off, int len) throws IOException;
举例:使用Reader读取
public class TestStream {
public static void main(String[] args) {
String directory = "D:"+File.separator+"test1"+File.separator
+"java"+File.separator+"hh.txt";
//File和本地文件系统相关联
File file = new File(directory);
try (Reader reader = new FileReader(file);){
char[] buff = new char[1024];
int len = -1;
while ((len = reader.read(buff))!= -1){
System.out.println(new String(buff, 0, len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
常用的节点流
- 父 类 :InputStream 、OutputStream、 Reader、 Writer
- 文 件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件进行处理的节点流
- 数 组 :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
- 字符串 :StringReader、 StringWriter 对字符串进行处理的节点流
- 管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流
代码展示
InputStream类是字节输入流的抽象类,是所有字节输入流的父类
字节流:(InputStream:)针对二进制文件:
--InputStream
--FileInputStream
--BufferedInputStream
--ObjectInputStream OutputStream
--FileOutputStream
--BufferedOutputStream
--ObjectOutputStream
Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类
字符流:针对文本文件,读写容易发生乱码现象,在读写时应指定编码集为UTF-8
-- Writer
-- BufferedWriter
-- OutputStreamWriter Reader
-- BufferedReader
-- InputStreamReader
-- PrintWriter/PrintStream
总结
-
输入流:InputStream或者Reader:从文件中读到程序中;
-
输出流:OutputStream或者Writer:从程序中输出到文件中;
-
所有的字符都需要通过内存缓冲来进行处理。如果字符流不关闭,数据就有可能保存在缓存中并没有输出到目标源。这种情况下必须强制刷新。
-
只有处理中文时会用到字符流,其他一般都使用字节流。