Java高效输入输出流讲解
Java中执行输出和输入操作,需要通过IO流。例如最常见的System.out.println()就是一个输出流。IO流的类比较多,但核心体系就是由File、 InputStream 、OutputStream、Reader、Writer和Serializable(接口)组成的。
I/O流基础概念
按照流的方向分为输入流(InputStream)与输出流(OuputStream):
- 输入流:只能读取数据,不能写入数据。
- 输出流:只能写入数据,不能读取数据。
因为程序是运行在内存中,以内存角度来理解输入输出概念,如下:
可以看到输入与输出是一个相对概念,数据写入文件,对于程序来说是输出流,对文件来说是输入流。但一般是以程序作为中心,所以从程序写入数据到其他位置,则是输出流,将数据读入程序中则是输入流。
简单的说就是:读取数据就是输入流,写入数据就是输出流。
按照处理的数据单位分为字节流和字符流
- 字节流:操作的数据单元是8位的字节。InputStream、OutputStream作为抽象基类。
- 字符流:操作的数据单元是字符。以Writer、Reader作为抽象基类。
- 字节流可以处理所有数据文件,若处理的是纯文本数据,建议使用字符流。
IO流中的三类数据源
- 基于磁盘文件:FileInputStream、FileOutputSteam、FileReader、FileWriter
- 基于内存:ByteArrayInputStream ByteArrayOutputStream(ps:字节数组都是在内存中产生)
- 基于网络:SocketInputStream、SocketOutputStream(ps:网络通信时传输数据)
根据流的作用可分为节点流和处理流
- 节点流:程序直接与数据源连接,和实际的输入/输出节点连接;
- 处理流:对节点流进行包装,扩展原来的功能,由处理流执行IO操作。
处理流的作用和分类
- 处理流可以隐藏底层设备上节点流的差异,无需关心数据源的来源,程序只需要通过处理流执行IO操作。处理流以节点流作为构造参数。通常情况下,推荐使用处理流来完成IO操作。
- 缓冲流:提供一个缓冲区,能够提高输入/输出的执行效率,减少同节点的频繁操作。例如:BufferedInputStream/BufferedOutputStream、BufferedReader/BufferWriter
- 转换流:将字节流转成字符流。字节流使用范围广,但字符流更方便。例如一个字节流的数据源是纯文本,转成字符流来处理会更好。InputStreamReader/OutputStreamWriter
- 打印输出流:打印输出指定内容,根据构造参数中的节点流来决定输出到何处。
PrintStream :打印输出字节数据。 PrintWriter : 打印输出文本数据。
(一)使用字节流读取本地文件
来源:https://blog.csdn.net/S_999999/article/details/99287235