iO流
IO流:
数据在两设备间的传输称为流,,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
1、但凡是对数据的操作,Java都是通过流的方式来操作的。
2、程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
3、IO流可以做到数据的持久化,但是IO流本质上是用来处理本地文件系统以及不同设备之间的数据传输。
IO流结构如图下:
IO流的分类:
IO流是根据数据类型来分的,分为字节流和字符流。
字节流:一般拿来处理图片视频等文件,同时字节流也是万能流。(主要用来处理字节或二进制对象)
字符流:主要用来处理字符流,还有列如 xml、json 、html 、TXT等文件。
注:只要是处理纯文本数据,就优先考虑使用字符流,除此之外都使用字节流。
根据数据流来分为输入流和输出流。
字节输入流:
输入流只能进行读操作,而不能向其写入数据。InputStream 是所有的输入字节流的父类,它是一个抽象类。
FileInputStream 的构造方法
FileInputStream(File file) 创建一个从file读取数据的输入流
FileInputStream(String name) 创建一个从name文件读取数据的输入流
字节输出流:
输出流这只能进行写操作,而不能向其读取数据。
OutputStream是所有字节输出流的父类,它是一个抽象类。
FileOutputStream构造方法
FileOutputStream(String name) 创建一个向name文件中写数据的输出文件流
FileOutputStream(File file) 创建一个向file文件中写数据的输出文件流
FileOutputStream(File file, boolean append) 创建一个向file文件中追加数据的输出文件流
void close() 关闭此文件输出流并释放与此流有关的所有系统资源
字节缓冲流:
通过之前的学习观察我们发现,字节流一次读写一个字节数组,大小为1024的速度明显比一次读写一个字节的速度要快的多的多,
因为这里加入了数组缓冲区的思想,Java考虑到流读写效率的提升所以为我们提供了字节缓冲流。
字节缓冲输出流 :BufferedOutputStream
字节缓冲输入流 :BufferedInputStream
关于字节流的一些注意事项:
1、数据写入完成后记得调用close()方法关闭流对象
2、数据追加写入要使用如下构造方法 FileOutputStream(File file, boolean append)
3、不同的系统针对不同的换行符号识别是不一样的
例如:windows识别的换行符是\r\n,Linux识别的换行符是\n等等。常见的一些高级记事本,是可以识别任 意换行符号的。
4、数据写入中存在两个异常需要处理FileNotFoundException,IOException
Reader 是所有的输入字符流的父类,它是一个抽象类。
CharReader、StringReader是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。
FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。
FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。
字符输出流:
OutputStreamWriter的成员方法
public void write(int c) 写一个字符
public void write(char[ ] cbuf) 写一个字符数组
public void write(char[ ] cbuf,int off,int len) 写一个字符数组的一部分
public void write(String str) 写一个字符串
public void write(String str,int off,int len) 写一个字符串的一部分
void close() 关闭流对象
void flush() 清空缓存
FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个OutputStreamWriter。
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
构造方法类似FileInputStream和FileOutputStream 成员方法完全继承自父类OutputStreamWriter和InputStreamReader
字符缓冲流:
BufferedWriter和BufferedReader继承自Writer和Reader,所以具备原有的读取方法,但是还存在自己特有的方法。
特有的方法:
BufferedWriter:void newLine()
BufferedReader:String readLine()