在Java中,把一组有序的数据序列称为流。java
在Java中流是使用统一的方式操做输入和输出的数据。数组
流就是一个对象。所在的包java.io.*,Java I/O系统负责处理程序的输入和输出,java.io包它对各类常见的输入流和输出流进行了抽象。微信
a)输入流:将数据读取到程序中就是输入流,reader
b)输出流:将程序中的数据写出到文件中就是输出流。writer网络
a)字节类:若是数据流中最小的数据单元是字节,那么称这种流为字节流;字节流处理单元为 1 个字节,能够操做字节和字节数组dom
b)字符类:若是数据流中最小的数据单元是字符,那么称这种流为字符流。字符流处理的单元为 2 个字节的 Unicode 字符,能够操做字符、字符数组或字符串Java内用Unicode 编码存储字符,字符流处理类负责将外部的其余编码的字符流和java内Unicode 字符流之间的转换。字符流(一次能够处理一个缓冲区)一次操做比字节流(一次一个字节)效率高。性能
a)节点流,如FileInputStream
b)包装流/处理流,如BufferedInputStream。带有缓冲区编码
分别表示字节输入流和字节输出流,
是全部字节输入和输出流的父类.其中的方法参照下面的四线程
针对文件进行字节操做。code
带有缓冲区的流。---调用flush()刷新缓冲流。
加强输入和输出流的性能。
提升读写的效率。
包装流是能够对其余流进行从新包装。对象
针对于基本数据类型进行操做
针对于类类型的数据(对象)进行操做。
序列化:将对象保存到文件中或者传输到网络的过程。
反序列化:将文件中或者网络中将对象读取到程序的过程。
进行序列化或者反序列化的类必须实现Serializable接口。该接口是一个空接口, 只是起到了标识的做用,标识该对象能够进行序列化和反序列化serialVersionUID用来代表实现序列化类的不一样版本间的兼容性。若是你修改了此类, 要修改此值。不然之前用老版本的类序列化的类恢复时会出错。
transient:该修饰的属性不会被序列化。是透明的属性。
管道输入,输出流,
针对线程读取和写入数据
connect():管道输入流链接到管道输出流
是全部字符流输出和输入的父类。
字符流是在字节流的基础上进行字符编码(UTF-8,GBK,GB2312...)
一组转换流--->字节和字符之间的转换。
InputStreamReader:字节转换成字符的桥梁
OutputStreamWriter:字符转换成字节的桥梁
带有缓冲区的字符流。
1)保存hello,您好时指定编码方式。
取数据时也指定编码方式。
2)采用这种方式完成文件的拷贝工做。
针对文件的字符流
都是输出流,能够进行格式化输出
PrintWriter:便可以包装字符类,也能够包装字节流。
PrintStream便可以输出字符,也能够输出字节
在文件的任意位置进行读和写的操做
seek(long),read(),writer();
当操做大文件的时候使用该类。
在java.io包中,java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类,不能被实例化。
read(): 从输入流读取数据:有三种重载形式:
a)int read(): 从输入流读取一个8位的字节,把它转换为0-255之间的整数,并返回这一整数。例如,若是读到的字节为9,则返回9,若是读到
的字节为-9,则返回247。若是遇到输入流的结尾,则返回-1;
b)int read(byte[] b): 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。返回的整数表示读取的字节数。若是遇到输入流的结尾,则返回-1;
c)int read(byte[] b, int off, int len): 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。 返回的整数表示读取的字节数。参数off指定在字节数组中开始保存数据的起始下标,参数len指定读取的字节数目。返回的整数表示实现读取的字节数。若是遇到输入流的结尾,则返回-1;以上第一个read方法从输入流读取一个字节,而其他两个read方法从输入流批量读取若干字节。在从文件或键盘读数据时,采用后面两个read方法能够减小进行物理读文件或键盘的次数,所以能提升I/O操做的效率。
void close(): 关闭输入流,InputStream类自己的close()方法不执行任何操做。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。
int available(): 返回能够从输入流中读取的字节数目;
skip(long): 从输入流中跳过参数n指定数目的字节。
boolean markSupported(),void mark(int),void reset(): 若是要从流中重复读入数据,先用markSupported()方法来判断这个流是否支持重复读入数据,若是返回true,则代表能够在流上设置标记。接下来调用mark(int readLimit)方法从流的当前位置开始设置标记。最后调用reset()方法,该方法使输入流从新定位到刚才作了标记的起始位置。这样就能够重复读取作过标记的数据了。
write(): 向输出流写入数据:有三种重载形式:
a)void write(int b):向输出流写入一个字节;
b)void write(byte[] b): 把参数b指定的字节数组中的全部字节写到输流;
c)void write(byte[] b, int off, int len): 把参数b指定的字节数组中的全部字节写到输出流,参数off指定字节数组的起始下标,从这个位置开始输出由参数len指定数目的字节; 以上第一个write方法从输出流写入一个字节,而其他两个write方法从输出流批量写出若干字节。在向文件或控制台写数据时,采用后面两个write方法能够减小进行物理读文件或键盘的次数,所以能提升I/O操做的效率。
void close(): 关闭输出流,OutputStream类自己的close()方法不执行任何操做。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。
void flush(): OutputStream类自己的flush()方法不执行任何操做,它的一些带有缓冲区的子类(好比BufferedOutputStream和PrintStream类)覆盖了flush()方法。经过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到必定程度才会真正写到输出流中。缓冲区一般用字节数组实现,其实是指一块内存空间。flush()方法强制把缓冲区内的数据写到输出中。
1)选择合适的流
2)建立流对象
3)进行读写的操做
4)关闭资源
关注做者微信公众号: