概述
Java 的 I/O ⼤大概可以分成以下几类:
磁盘操作:File 字节操作:InputStream 和 OutputStream 字符操作:Reader 和 Writer 对象操作:Serializable ⽹网络操作:Socket 新的输⼊入/输出:NIO
流
流的特点
- 先进先出:最先写入输出流的数据最先被输入流读取到。
- 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
IO流的分类
按方向分类
输入流:从外部(数据源)把数据输入到程序(内存)。
- 输出流:把程序的数据(内存)输出到外部(数据源)。
按处理数据类型分类
1字符 = 2字节 、 1字节(byte) = 8位(bit)
- 字节流:每次读 (写)一个字节,当传输的资源文件有中文时,就会出现乱码,读写的单位是byte,在InputStream/OutputStream中单向流动
- 字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文,读写的单位是char,在Reader/Writer中单向流动
字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。
字节流一般用来处理图片,视频,音频等一切文件都可以处理。字符流一般用来处理纯文本文件
缓冲流
还有一种流是缓冲流,区别于没有缓冲的流。
因为程序和内存交互很快,而程序和磁盘交互是很慢的,这样会导致程序出现性能问题。
为了减少程序与磁盘的交互,是提升程序效率,引入了缓冲流。
普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数。
有缓冲的流,类名前缀是带有Buffer的,比如BufferedInputStream、BufferedReader。
字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了
类
磁盘操作
File f = new File("D:\\1java\\疑难杂症.txt");
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进制转换成的十进制。