Java IO流
一、Java IO流基础
1、流式输入/输出原理
在java程序中,对于数据的输入/输出操作以"流"(stream)方式进行;J2SDK提供了各种各样的"流"类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据
2、输入流/输出流
3、节点流/处理流
3.1 节点流
节点流就是一根管道直接插到数据源上面,直接读数据源里面的数据,或者是直接往数据源里面写入数据。典型的节点流是文件流:文件的字节输入流(FileInputStream
),文件的字节输出流(FileOutputStream
),文件的字符输入流(FileReader
),文件的字符输出流(FileWriter
)
3.2 处理流
处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
如BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
;处理流的构造方法总是要带一个其他的流对象做参数,一个流对象经过其他流的多次包装,称为流的链接
二、节点流讲解
1、InputStream(输入流)
1 | //读取一个字节并以整数的形式返回(0~255) |
2、OutputStream(输出流)
1 | //向输出流中写入一个字节数据,该字节数据为参数b的低8位 |
注意:FilelnputStream和FileOutputStream这两个流都是字节流,都是以一个字节为单位进行输入和输出的。所以对于占用2个字节存储空间的字符来说读取出来时就会显示成乱码
3、Reader流
1 | //读取一个字节并以整数的形式返回(0~255) |
4、Writer流
1 | //向输出流中写入一个字节数据,该字节数据为参数b的低8位 |
注意:FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的,所以读取和写入占用2个字节的字符时都可以正常地显示出来
三、 处理流讲解
1、缓冲流(Buffering)
缓冲流要“套接在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法
1 | BufferedReader(Reader in) |
- 缓冲输入流支持其父类的mark和reset方法
- BufferedReader提供了readLine方法用于读取一行字符串
- BufferedWriter提供了newLine用于写入一个行分隔符
- 对于输出的缓冲流,写出的数据会现在内存中缓存,使用flush方法将会使内存中的数据立刻写出
2、转换流
- InputstreamReader 和OutputStreamwriter 用于字节数据到字符数据之间的转换
- InputstreamReader 需要和Inputstream“套接"。
- OutputstreamWriter 需要和Outputstream“套接"。
- 转换流在构造时可以指定其编码集合
1 | Inputstream isr=new InputstreamReader(System.in, "ISO8859-1") |
3、数据流
- DatalnputStream 和DataOutputStream 分别继承自InputStream和 OutputStream,它属于处理流,需要分别“套接"在Inputstream和OutputStream类型的节点流上
- Datalnputstream 和DataOutputStream 提供了可以存取与机器无关的Java原始类型数据(int,double等)的方法
- DatalnputStream 和DataOutputStream的构造方法
1 | DataInputstream(InputStream in) |
举例
1 | public static void main(String args[]){ |
4、打印流(Print)
- PrintWriter 和PrintStream都属于输出流,分别针对与字符和字节
- PrintWriter 和PrintStream 提供了重载的print
- Println方法用于多种数据类型的输出
- PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
- PrintWriter 和PrintStream有自动flush功能
1 | Printwriter(Writer out) |
5、对象流(Object)
直接将Object写入或读出,直接实现Serializable接口的类是JDK自动把这个类的对象序列化,而如果实现public interface Externalizable extends Serializable的类则可以自己控制对象的序列化,建议能让JDK自己控制序列化的就不要让自己去控制
1 | import java.io.*; |
四、总结
参考文章