一、明确要操作的数据是读还是写
读
InputStream Reader
写
OutputStream Writer
二、明确要操作的设备上的数据是字节还是文本
读
字节: InputStream
文本: Reader
写
字节: OutputStream
文本: Writer
三、明确数据所在的具体设备
源设备:
硬盘:文件File开头
内存:数组,字符串
键盘:System.in
网络:Socket
对应目的设备
硬盘:文件 File开头
内存:数组,字符串
屏幕:System.out
网络:Socket
四、明确是否需要额外功能
需要转换—— 转换流 InputStreamReader 、OutputStreamWriter
需要高效—— 缓冲流Bufferedxxx
多个源—— 序列流 SequenceInputStream
对象序列化—— ObjectInputStream、ObjectOutputStream
保证数据的输出形式—— 打印流PrintStream 、Printwriter
操作基本数据,保证字节原样性——DataOutputStream、DataInputStream
五、File类
至于IO流,也就是输入输出流,从文件出发到文件结束,至始至终都离不开文件,所以IO流还得从文件File类讲起。
File类是专门对文件进行操作的类,只能对文件本身进行操作,不能对文件内容进行操作。File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File跟流无关,File类不能对文件进行读和写也就是输入和输出
六、初探IO流
按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据
根据数据的流向分为:输入流 和 输出流。
- 输入流 :把数据从其他设备上读取到内存中的流。
- 输出流 :把数据从内存 中写出到其他设备上的流。
根据数据的类型分为:字节流 和 字符流。
- 字节流 :以字节为单位,读写数据的流。
- 字符流 :以字符为单位,读写数据的流
七、字节流OutputStream与InputStream
OutputStream是字节输出流的所有类的超类
1、public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
2、public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
3、public void write(byte[] b):将 b.length个字节从指定的字节数组写入此输出流。
4、public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 也就是说从off个字节数开始读取一直到len个字节结束
5、public abstract void write(int b) :将指定的字节输出流
InputStream是字节输入流的所有类的超类
1、public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
2、public abstract int read(): 从输入流读取数据的下一个字节。
3、public int read(byte[] b): 该方法返回的int值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1
FileInputStream类
- java.io.FileInputStream类是文件输入流,从文件中读取字节。
FileOutputStream类
- 使用FileOutputStream写出字节数据主要通过Write方法,而write方法分如下三种
1、public void write(int b) 写出字节,每次可以写出一个字节数据
2、public void write(byte[] b) 写出字节数组,每次可以写出数组中的数据
3、public void write(byte[] b,int off,int len) //写出指定长度字节数组,从`off`索引开始,`len`个字节
八、字符流Reader和Writer的
字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码,中文一个汉字占个2个字节,不能1个字节1个字节去读,而是应该一个字符一个字符去读)
字符输入流(Reader)
1、public void close() :关闭此流并释放与此流相关联的任何系统资源。
2、public int read(): 从输入流读取一个字符。
3、public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader类
java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
字符输出流(Writer)
1、void write(int c) 写入单个字符。
2、void write(char[] cbuf)写入字符数组。
3、abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4、void write(String str)写入字符串。
5、void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6、void flush()刷新该流的缓冲。
7、void close() 关闭此流,但要先刷新它。
FileWriter类
java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
注意:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流
九、缓冲流
字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter
十、转换流
众所周知,计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。
编码:字符(能看懂的)–字节(看不懂的)
解码:字节(看不懂的)–>字符(能看懂的)
String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
- 编码:把看得懂的变成看不懂的 String – byte[]
- 解码:把看不懂的变成看得懂的 byte[] – String
InputStreamReader类-----(字节流到字符流的桥梁)
OutputStreamWriter类-----(字符流到字节流的桥梁)
本来引自:https://www.cnblogs.com/yichunguo/p/11775270.html