IO流
2019-04-14 / JAVA / 896 次围观 / 0 次吐槽 /什么是IO流?
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的类都在IO包中
IO流分类
按流向来分
输入流InpuStream(读取数据)
输出流OutStream(写数据)
按操作类型分
字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流 : 字符流只能操作纯字符数据
Java中常用IO流的类
字节流的抽象父类:
InputStream 输入流
OutputStream 输出流
字符流的抽象父类:
Reader 字符读取流
Writer 字符写入流
字节流
InputStream
InputStream是抽象类,表示字节输入流,用于读数据。
子类:
AudioInputStream
ByteArrayInputStream
FileInputStream //文件输入流
FilterInputStream
ObjectInputStream
PipedInputStream
SequenceInputStream
StringBufferInputStream
OutputStream
OutputStream译为输出流
OutputStream是一个抽象类,它用于往文件里写入内容
子类:
FileOutputStream //文件输出流
字符流
什么是字符流
字符流是可以直接读写字符的IO流
使用字符流从文件中读取字符时, 需要先读取到字节数据, 然后转为字符.
使用字符流往文件写入字符时, 需要把字符转为字节再写入文件.
字符流有两大派
Reader和Writer,这两个类是抽象类,一般使用它们的子类
FileReader和FileWriter
FileReader的使用
FileReader 用于读取字符,调用read方法的时候,是读取一个字符
read方法的返回值是int,它是把char 转成int
以后读纯文本文件,使用FileReader这个类,为什么?因为我们不用考虑乱码问题
使用字符流的场景
1.使用FileReader读取字符
原理:先读字节,把字节转成字符(byte -> char)
2.使用FileWriter写入字符
原理:writer(String str),str 转成 字符数组 再转成 字节写入文件
(string -> char[] -> char -> byte)
如果是读取文本文件,使用FileReader比较好,不考虑乱码问题
如果是写入文本文件,不建议使用FileWriter,直接使用FileOutputStream好一点
因为是字节直接写入文件,不需要过多数据类型转换
流的标准处理异常方式
jdk1.6以前的处理方式
读写的操作放在try里面
关闭流的操作放finally
jdk1.7以后的处理方式
1.把流对象的声明放在try() 括号里面
2.操作流【读写数据】的代码放在花括号里面
3.这样写不用关闭流,java自动关闭流
4.在try的括号里的对象,必须是实现AutoCloseable的接口
带缓冲的字节输入输出流
BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
当使用BufferedInputStream读取一个字节时,BufferedInputStream会一次性从文件中读取8192个(8Kb), 存在缓冲区中,直到缓冲区装满了, 才重新从文件中读取下一个8192个字节数组
BufferedOutputStream
BufferedOutputStream也内置了一个缓冲区(数组)
向流中写入字节时, 不会直接写到文件, 先写到缓冲区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
SequenceInputStream 序列流
序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时,
将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推
对象操作流
ObjectOutputStream
这个类是将一个对象写入文件
如果使用这个类写入对象,这个对象需要序列化
序列化就是让这个对象实现一个Serializable接口
如果没实现Serializable接口,会抛异常NotSerializableException
对象写入文件时,乱码没有关系,取出来正确就行了
ObjectInputStream
这个类是从文件中读取对象
打印流
PrintStream 打印字节流
System.out就是一个PrintStream, 其默认向控制台输出信息
该流可以很方便的将对象的toString()结果输出, 并且自动加上换行
PrintWriter 打印字符流
这个流是向文件打印信息,也就是将打印的内容写入文件
标准输入输出流
System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
随机访问流
RandomAccessFile类不属于流,是Object类的子类。
但它融合了InputStream和OutputStream的功能。
支持对随机访问文件的读取和写入。
数据输入输出流
DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据
例如按Long大小写出一个数字, 写出时该数据占8字节.
读取的时候也可以按照Long类型读取, 一次读取8个字节.
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.