流
流的定义:流是对内存中一组有序数据从起点到终点传输的抽象概念。
当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接;类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。这时候你就可以想象数据好像在这其中“流”动一样,如下图:
输入流
输出流
综合上图,人站在程序的角度来看:如果数据从外界传输程序中,则为输入流,例如从键盘输入数据到程序中;如果数据从程序中传到外界,则为输出流,例如程序中的数据输出到显示器中,或者输出到文件中。我们把这些不同源和目标的数据都统一抽象为I/O流。
Java I/O流的分类
按流向分:
- 输入流: 程序可以从中读取数据的流。
- 输出流: 程序能向其中写入数据的流。
按数据传输单位分:
- 字节流: 以字节为单位传输数据的流(一次读入或读出是8位二进制)
- 字符流: 以字符为单位传输数据的流(一次读入或读出是16位二进制)
按功能分:
- 节点流: 直接与数据源(source)或者目标(destination)相连接的流
- 处理流(过滤流): 是对一个已存在的节点流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

注意:
- 字节流到字符流转换:可以通过InputStreamReader(继承自Reader)或者OutputStreamWriter(继承自Writer)实现。
- 字符流到字节流转换:可以从字符流中获取char[]数组,转换为String,然后调用String的API函数getBytes() 获取到byte[],最后通过ByteArrayInputStream或者ByteArrayOutputStream来实现到字节流的转换。
- 处理流用来封装节点流,从而给节点流增加功能,不能独立存在。在关闭流时如果使用了处理流,只需关闭最外层的流就可以了。
- 区分节点流和处理流的小方法:看流的构造器参数,节点流参数为操作数据,而处理流参数为其他流。
Java I/O流选择策略
从Java I/O流的分类中,我们可以总结出I/O流的使用选择策略:
- 先考虑是字节流还是字符流
- 再考虑是输入流还是输出流
- 最后考虑是节点流还是处理流
Java I/O流常用类
JDK所提供的所有I/O流类位于java.io包中,都分别继承自以下四种抽象流类。(1char = 2byte = 16bit,1字=2字节=16位)
- InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
- OutputStream:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
- Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
- Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。
Java I/O流类图结构如下图所示:
Java I/O一般使用原则
一、按数据格式分:
- 二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有子类
- 纯文本格式(含纯英文与汉字或其他编码方式):Reader, Writer及其所有带Reader,
二、按输入输出分:
- 输入:Reader, InputStream类型的子类
- 输出:Writer, OutputStream类型的子类
三、按数据来源(去向)分:
- 文件: FileInputStream, FileOutputStream, FileReader, FileWriter
- byte[]:ByteArrayInputStream, ByteArrayOutputStream
- Char[]: CharArrayReader, CharArrayWriter
- String: StringBufferInputStream, StringReader, StringWriter
- 网络数据流:InputStream, OutputStream, Reader, Writer
四、按是否要缓冲分:
- 缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
- 格式化输出:PrintStream, PrintWriter
六、特殊需要:
- 从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
- 对象输入输出:ObjectInputStream, ObjectOutputStream
- 进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
- 合并输入:SequenceInputStream
- 更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
文件
File类
File是对文件系统中文件以及文件夹进行封装的类,可以通过对象的思想来操作文件和文件夹。File对象保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。RandomAccessFile类
RandomAccessFile并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。它的特点是:
- 只能操作文件,不能操作文件夹,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
- 既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)
注意:RandomAccessFile在实例化:如果要操作的文件不存在,会自动创建;如果文件存在,写操作未指定写入位置,会从头开始写,即覆盖原有的内容。 可以用于多线程下载或多个线程同时写数据到文件。