IO流

IO流

IO流

流的概念:
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源设备的流,这个数据源设备可以是文件、内存或网络连接。流是含有流质具有方向的抽象管道。
流的特点:
流有两个最基本的特性:一是它含有流质,而是它有方向
对流的读或写就是针对设备进行信息的输入或输出。我们可以将流理解为传送数据的管道。管道的一段是固定的,就是系统的内存;管道的另一端连的是不同的设备。
流的作用:
用于应用程序和内外部进行数据通讯。

流的分类
方向:
输入流inputStream 继承自抽象类InputStream或Reader
输出流outputStream继承自抽象类OutputStream或Writer

流的数据单位:
1.字节流 1个字节 8位二进制数继承自抽象类InputStream或OutputStream。
2.字符流 char字符(2个字节)继承自抽象类Reader或者Writer

流的功能:
低级流(节点流)节点流是可以直接从/向一个特定的数据源(例如磁盘文件、内存、网络)读/写数据的流。
高级流(处理流不直接连接到设备,而是连接在已存在的流(节点流或处理流))

文件类
File既代表文件又代表目录
File.exist()
File.isFile();

低级字节流
无论是什么类型的文件都可以使用字节流。InputStream和OutputStream。
音频、视频图片等文件使用字节流。
文本型文件一般使用字符流。
低级字符流
文本文件,适合使用字符流来读取、写入

高级字节流
缓冲流:BufferedInputStream和BufferedOutputStream利用缓冲区来提高读写数据的效率。
BufferedReader和BufferedWriter类,与BufferedInputStream和BuffedOutputStream类似,可以利用缓冲区来提高读写数据的效率,用来装饰其它的字符流。比BufferedInputStream和BuffedOutputStream更强大的是,这两个类可以整行读写字符。
数据流:DataInputStream和DataOutputStream。与计算机无关,非文件。

对象流
ObjectInputStream/ObjectOutputStream之所以能完成基于对象的读写,是因为Java提供了一套对象序列化机制。序列化机制就是一套向流写入或读取对象数据的自动机制,这套机制将读写的实现封装在对象自身的实现之中。
ObjectInputStream/ObjectOutputStream
使用ObjectOutputStream类将对象拆成字节序列的过程,称为对象序列化;而使用ObjectInputStream类,将字节序列还原成对象的过程,称为对象反序列化。

一、按数据源分类
1)如果数据源是文件,对于字节流,使用FileInputStream和FileOutputStream;对于字符流,使用FileReader和 FileWriter。
2)如果数据源是字节数组byte[],则使用ByteArrayInputStream和ByteArrayOutputStream。
3)如果数据源是字符数组Char[],则使用CharArrayReader和CharArrayWriter。
4)如果数据源是String对象,对于字节流,则使用StringBufferInputStream和StringBufferOuputStream;对于字符流,则使用StringReader和StringWriter。
5)如果数据源是网络数据流,对于字节流,使用InputStream和OutputStream;对于字符流,使用Reader和Writer。
二、按是否格式化输出分:要格式化输出,则使用PrintStream或PrintWriter。
三、按是否要缓冲分,要缓冲的话,对于字节流使用BufferedInputStream和BufferedOutputStream;对于字节流,使用BufferedReader和BufferedWriter。
四、按数据格式分
1)二进制格式(只要不能确定是纯文本的):使用InputStream、OutputStream 及其所有带 Stream结束的子类。
2)纯文本格式(含纯英文与汉字或其他编码方式):使用Reader、Writer 及其所有带 Reader、Writer 的子类。
五、按输入输出分
1)输入:使用Reader、InputStream 类型的子类。
2)输出:使用Writer、OutputStream 类型的子类。
六、特殊需要
1)从Stream到Reader、Writer的转换类:InputStreamReader、OutputStreamWriter。
2)对象输入输出:ObjectInputStream、ObjectOutputStream。
3)线程间通信:PipeInputStream、PipeOutputStream、PipeReader、PipeWriter。
4)合并输入:SequenceInputStream。
5)更特殊的需要:PushbackInputStream、PushbackReader、LineNumberInputStream、LineNumberReader。