概述

Java 的 I/O ⼤大概可以分成以下几类:

磁盘操作:File 字节操作:InputStream 和 OutputStream 字符操作:Reader 和 Writer 对象操作:Serializable ⽹网络操作:Socket 新的输⼊入/输出:NIO

v2-a19daa1c0e31746dc8891ea1e4e99855_r.jpg

流的特点

  • 先进先出:最先写入输出流的数据最先被输入流读取到。
  • 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
  • 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

    IO流的分类

    按方向分类

  • 输入流:从外部(数据源)把数据输入到程序(内存)。

  • 输出流:把程序的数据(内存)输出到外部(数据源)。

v2-4d2bde9edd85044e502998a4fac973f6_r.png

按处理数据类型分类

1字符 = 2字节 、 1字节(byte) = 8位(bit)

  • 字节流:每次读 (写)一个字节,当传输的资源文件有中文时,就会出现乱码,读写的单位是byte,在InputStream/OutputStream中单向流动
  • 字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文,读写的单位是char,在Reader/Writer中单向流动

字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

字节流一般用来处理图片,视频,音频等一切文件都可以处理。字符流一般用来处理纯文本文件

缓冲流

还有一种流是缓冲流,区别于没有缓冲的流。

因为程序和内存交互很快,而程序和磁盘交互是很慢的,这样会导致程序出现性能问题。
为了减少程序与磁盘的交互,是提升程序效率,引入了缓冲流

普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数。
有缓冲的流,类名前缀是带有Buffer的,比如BufferedInputStream、BufferedReader。

字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了
v2-3a332b3374e1ba63e1af98e6e2977b2c_720w.jpg

流操作

这四个都是抽象类,都位于java.io包目录。
v2-ae21aba56d1e4f8ebedcc748d20fe6bf_720w.jpg

磁盘操作

  1. File f = new File("D:\\1java\\疑难杂症.txt");
  2. long a = f.length();//文件长度

更多操作查询API File类

关于字节

byte字节,是java的基本类型,数值型取值范围 -128—127
计算机最小单位是bit,而1字节等于8bit,一个字节相当于8位2进制在组成,最高位为符号位。
计算机表示数据一般用的就是字节,一个视频文件,底层保存数据就是用的一串一串的8位二进制。而一串8位二进制正好可以放进byte基本数据类型。

很多时候,字节流读取得图片啊,视频啊一切文件,都是读取的底层的一个一个字节,返回值就是byte,就是这个字节流读取到的字节,byte[],把读取到的字节放入字节数组,其实这个数组里面的字节就是组成被读取的文件的字节。
打印这个byte[]里面的数据,发现是-128——127之间的数据,计算机不是二进制码,其实这些是一串一串的8位2进制转换成的十进制。