Java-IO流
IO常用类:File、RandomAccessFile、InputStream、OutputStream、Reader、Writer。
- File:对文件及其目录的操作,比如说改目录,找路径,改文件名等;
- RandomAccessFile:就是随机文件操作,直接就继承了object,能对文件的任意位置进行存取;
- Input/OutputStream:节输入输出流,相当于是所有输入输出流的父类,就相当于是包含字符流;
- Reader/Writer:字符输入输出流,这里,就是单针对对字符的操作。当需要输入输出字符时就选择R/W。非字符类型的输入输出,例如图片则需使用Input/OutputStream;
一.流的概念:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。它的特性是进行数据传输;
例如从水源地长江把水导入自来水厂,然后又从自来水厂把水送到各家各户。从长江到自来水厂之间的管道我们可以称之为输入流,从自来水厂把水送到各家各户的管道我们称之为输出流,我们大概可以这么理解。
二.流的继承体系
在java中,为了对不同来源和性质的流对象调用统一的方法,java中的流首先定义了顶层输入/输出流的接口或抽象类,这样不同性质具体的流对象就会有统一的调用方法以便使用,在使用流对象时,尽量的按照在具体流所实现的接口(抽象类)中定义的方法使用。
三.流的分类
流按照流向数据流向可以分为输入流和输出流。
流按照处理数据类型的单位不同可以分为字节流和字符流。
四.字节流和字符流
字节流:InputStream和OutputStream是java中可以按照最小字节单位读取的流,即每次读写一个字节,字节流是直接连接到输入源的流。
字符流:是以字符为单位进行数据处理的IO流。本质其实就是基于字节流读取时,去查找指定的码表。
字节流与字符流之间的区别:
1.读写单位不同:字节流式以字节(8位2进制)为单位,字符流是以字符为单位,根据码表映射字符,一次可能读多个字节。
2.处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
3.一次读入或读出是8位二进制。
4.字符流:一次读入或读出是16位二进制。
结论:只要是纯文本数据优先使用字符流,除此之外都使用字节流。
五.输入流和输出流的用途
输入流是指程序从数据源中读取数据。只进行读操作;
输出流是指将数据从程序中写到指定的文件中;
节点流:直接与数据相连,进行数据的读写;
处理流:是指在节点流上套接了一层。
常用的节点流
1.文 件 :
FileInputStream
、FileOutputStrean
、FileReader
、FileWriter
文件进行处理的节点流2.数 组 :
ByteArrayInputStream
、ByteArrayOutputStream
、CharArrayReader
、CharArrayWriter
对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)3.字符串 :
StringReader
、StringWriter
对字符串进行处理的节点流4.管 道 :
PipedInputStream
、PipedOutputStream
、PipedReader
、PipedWriter
对管道进行处理的节点流常用的处理流
1.缓冲流:
BufferedInputStrean
、BufferedOutputStream
、BufferedReader
、BufferedWriter
增加缓冲功能,避免频繁读写硬盘。2.转换流:
InputStreamReader
、OutputStreamReader
实现字节流和字符流之间的转换。3.数据流:
DataInputStream
、DataOutputStream
等-提供将基础数据类型写入到文件中,或者读取出来。
输入流
主要包括FileInputStream、ByteArrayInputStream、PipedInputStream、FilterInputStream;
方法:
- read():读取一个字节并将其返回成int值,到输入流尾的时候返回-1;
- read(byte[] buffer):读取最大值一直到达缓冲区长度,返回在缓冲区读取的字节数,到输入流的尾返回-1;
- read(byte[] buffer, int offset, int length):读取到指定长度的字节,数据从偏索引开始写入缓冲区;
- close():关闭输入流;
- available():返回可以从此输入流读取但不阻塞的估计字节数(即相当于是最大流量);
文件输入流
缓冲输入流
顾名思义就是给数据一个缓冲区间,起到维护内部储存的一个缓冲区来存储输入流读取的字节。
数据输入流
用来读取输入流中的数据对应在Java中的基本数据类型值。
输出流
主要方法:
- write():将字节写入输出流中;
- flush():将缓冲区的字节刷新到数据库;
- close():关闭输出流;
文件输出流
数据输出流
DataOutputStream:将Java基本类型数据写入输出流。
管道
相当于是输入流和输出流的连接器。
PipedOutputStream对象表示一端,PipedInputStream对象表示另一端,然后通过connect方法将其连接起来。在操作时可以先连接管道的两端后生成和使用数据,通过使用PipedOutputStream对象的一个write()方法产生数据。无论对管道输出流写入什么,自动变得可用于管道输入流对象进行读取。使用PipedInputStream的read()方法从管道读取数据。如果数据在尝试从管道读取时不可用,则管道输入流被阻止。管道流具有固定容量的缓冲器,以在写入管道和从管道读取之间存储数据。在使用时可以设置管道容量,当我们创建它。如果管道的缓冲区已满,则尝试在管道上写入将被阻止。
缓冲区
缓冲区是固定长度的数据容器。有一个单独的缓冲区类型来保存每种类型的基本值的数据,除了布尔类型值。缓冲区是程序中的一个对象。有一个单独的类来表示每种类型的缓冲区。
缓冲区属性
以下是缓冲区的四个重要属性。
- Capacity
- Position
- Limit
- Mark
缓冲区的容量是它可以容纳的元素的最大数量。并且当创建缓冲器时它是固定的。
我们可以通过调用hasArray()方法检查缓冲区是否由数组支持,如果缓冲区由数组支持则返回true。
我们可以通过使用缓冲对象的array()方法来访问支持数组。
一旦我们访问了后台数组,对该数组所做的任何更改都将反映在缓冲区中。
缓冲区具有返回其容量的capacity()方法。