什么是 JAVA 中的“流”
流是一种抽象出来的概念,当数据在介质中传输,就形成了流,所以流就是用来进行数据的传输的
流的分类
JAVA 中的流根据其在方向上、处理数据单元上、使用方式上可以分为很多种类
流可以分为输入流和输出流两大类, I(input)和 O(output),即我们常说的 I/O 流,这里的输入和输出是对 JAVA 程序来说的,数据流向 JAVA 程序时,是流入,即输入流,数据从 JAVA 程序中输出时,是流出,即输出流
又可以根据数据单元的不同,分为字节流和字符流,字节流可以处理所有类型的数据,因为它是一个字节一个字节的去读取数据的,而字符流则更适合处理文本数据,他们和输入流及输出流的概念并不冲突
输入流
输入流是指将数据读入到 JAVA 程序中,包括 Reader
、InputStream
以及它们的子类,一下以实例说明用法
1 | public static void main(String[] args) throws IOException { |
这个样例是以 FileReader
为基础,使用包装流 Buffered
包装,将一个文件中的数据读入程序中,所有的输入流中,都包含 read 方法用来读入数据,与字节流不同的是,字符流中的 Reader
支持 readLine
方法,可以将一行数据一次性读入,这也证明了字符流更适合操作文本数据
1 | public static void main(String[] args) throws IOException { |
这个样例是一个典型的,使用字节流向 JAVA 程序读入数据的功能,这里的读入使用 read 函数,read 函数有三种使用方法,一种是无参的读入,read()
,它不会存储读入的数据,只是一味的将读入指针在文件中后移,第二种是有参的读入,read(byte[] bt)
,它会存储读入的数据,保存在名为 bt 的 byte 数组中,第三种是 read(byte[] bt, int orr, int len)
,它是从输入流读取 len 个字节的数据到 bt 数组,off 为 bt 数组的起始偏移量,这也体现了字符流和字节流在读入数据时的区别
输出流
输出流是将数据从 JAVA 程序输出到控制台或者文件中的流,可以理解为流出 JAVA 程序,包括 Writer
和 OutputStream
1 | public static void main(String[] args) throws IOException { |
这个样例是一个先使用 Reader
读入数据,再将读入到的数据使用 Writer
写入另一个文件的功能,使用包装流 BufferedWriter
对 FileWriter
进行包装,可以提高运行效率,在使用 Writer
中定义的 write 方法,将其写入到文件中,write 方法有三种,一种是write(char c)
,将指定的字符写入,第二种是write(CharSequence cs)
,将指定的字符序列写入,第三种是write(CharSequence cs, int off, int len)
,写入字符序列 cs 中从 off 位置开始,长度为 len 的数据
1 | public static void main(String[] args) throws IOException { |
这个样例就比较有趣了,使用字节流读入一张 jpg 的图片,再使用字节流输出到一个空的 jpg 文件中,实现文件的复制,因为是图片,这里必须使用字节流,使用 write 函数,将读入的字节数据,全部写入到另一个文件中,便完成了文件的复制
总结
这里说的只不过是流的简单用法,最重要的是,每种流都有它最擅长的地方,学会在什么情景下使用什么流,才是最关键的