流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。
流的本质:数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的作用:为数据源和目的地建立一个输送通道。
Java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。
IO的分类:
- 根据处理数据类型的不同分为:字符流和字节流
- 根据数据流向不同分为:输入流和输出流
- 按数据来源(去向)分类:
- File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
- byte[]:ByteArrayInputStream, ByteArrayOutputStream
- Char[]: CharArrayReader, CharArrayWriter
- String: StringBufferInputStream, StringReader, StringWriter
- 网络数据流:InputStream,OutputStream, Reader, Writer
下面重点从输入流和输出流进行区分。
字节流的父类
InputStream 是所有输入字节流的父类,是一个抽象类。
实现的接口有:Closeable, AutoCloseable
直接子类有:
ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream, InputStream, PipedInputStream,
AudioInputStream, SequenceInputStream, StringBufferInputStream
OutputStream 是所有输出字节流的父类,是一个抽象类。
实现的接口有:Closeable, Flushable, AutoCloseable
直接子类有:
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
字符流的父类
Reader 是所有的输入字符流的父类,是一个抽象类。
实现的接口有:Closeable, AutoCloseable, Readable
直接子类有:
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer 是所有的输出字符流的父类,它是一个抽象类。
实现的接口有:Closeable, Flushable, Appendable, AutoCloseable
直接子类有:
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
核心方法对比
输入流
InputStream
- read( )
- read(byte[ ])
- read(byte[ ], int, int)
Reader
- read( )
- read(char[ ])
- read(char[ ], int, int)
对比可以看到,输入流中字节流和字符流的核心方法都是一样的,区别在于字节流中缓存数据是以字节数组的形式存储,而字符流则是以字符数组的形式存储。
输出流
OutputStream
- write(int)
- write(byte[ ])
- write(byte[ ], int, int)
Writer
- write(int)
- write(char[ ])
- write(char[ ], int, int)
- write(String)
- write(String, int, int)
对比可以看到,核心方法都是一样的。Writer 要稍微多几个方法。
参考:
https://www.cnblogs.com/ylspace/p/8128112.html