字节流
IO流分类和功能:
按照数据流向:输入和输出流(读进来,写出去)
按照数据类型:字节流和字符流
底层原理:一切皆为字节
字节输出流的最高抽象父类:
java.io.OutputStream:是字节输出流的最高抽象父类
其中,常用的方法:
常用的子类是:java.io.FileOutputStream。
构造方法:
public FileOutputStream(String filename):参数代表文件的路径。
public FileOutputStream(File file):参数代表文件对象。
输入字符串时需要用get.Bytes()方法
追加数据内容:append
换行
文件换行:\r\n(这两个字符)
Linux换行符:\n(这是一个字符)
字节输入流的最高抽象父类
java.io.InputStream是字节输入流的最高抽象父类。
其中定义的常用方法:
public int read():读取单个字节。
public int read(byte[] buf):读取字节数组,返回有效个数。
public void close():关闭流,释放资源。
常用的子类是:java.io.FileInputStream类。
构造方法:
public FileInputStream(String filename):参数代表文件路径。
public FileInputStream(File file):参数代表文件对象。
使用步骤:
1. 创:创建FileInputStream对象,指定文件路径。
2. 读:调用read方法读取字节数据。
3. 关:调用close方法关闭流。
注意事项:
1. 对于写文件来说,如果不存在则自动创建;对于读文件来说,如果不存在则会发生
FileNotFoundException。
2. 这个read()每次执行都会尝试读取下一个,如果没有下一个则返回-1值。
每次循环执行了两次read方法
read读取字节的方法还有一个重要的重载形式
read(byte[2])
数组
复制文件(用字节)
改换复制文件方式(用字节数组)
字符流
- Idea工具查看文件与Windows产看的字节大小不一样。
因为编码方式不一样。
- 字符流底层
也是字节流,但是还有字节和字符之间的翻译功能。参考的是:ASCII/Unicode。
- 字符读入最高抽象父类reader
java.io.Reader是字符输入流的最高抽象父类。
-
常用方法
public int read():返回值代表读取的【单个字符】。
public int read(char[] buf):读取一个字符数组,返回有效个数。
public void close():关闭流。
- 常用子类
java.io.FileReader
- 构造方法
public FileReader(String filename):参数代表文件路径名。
public FileReader(File file):参数代表文件对象。
- 注意事项
字符流应该只用来处理纯文本文件,凡是能用Windows默认记事本打开并且正确识别的。
- 字符数组outStream
- 字符读进去最高抽象父类
java.io.Writer是字符输出流的最高抽象父类,其中定义的方法有:
public void write(int ch):写单个字符
public void write(char[] buf):写整个字符数组
public void write(char[] buf, int offset, int length):写字符数组的一部分。
public void write(String str):写整个字符串
public void write(String str, int offset, int length):写字符串的一部分。
public void close():关闭流
- 常用的子类writer
常用的子类是:java.io.FileWriter
构造方法:
public FileWriter(String filename):参数代表文件路径名。
public FileWriter(String filename, boolean append):第二个参数代表是否追加。
public FileWriter(File file):参数代表文件对象。
public FileWriter(File file, boolean append):第二个参数代表是否追加。
输出流中一个flush方法
- 缓冲区在读写数据的过程中有两个方向
从write –>jvm缓冲区 -> OS ->
从文件到到数据:
硬盘->-OS -> jvm缓冲区->write
- 使用建议
flush方法:刷新缓冲区。
close方法:内部也包含一个flush动作,并且关闭流。
使用建议:除非有极强的时效性或者数据稳定性要求,否则尽量避免频繁调用flush方法。
FileOutputStream里面没有缓冲区,所以flush方法根本没用。
FileInputStream/FileReader/FileWriter底层都有byte[8192]字节数组作为缓冲区。
后三者当中:
读数据:一次性读取8192个字节,read方法是从中取出一些字节进行使用。如果缓冲区用完了
空了,再次读取最多8192个字节。
写数据:每次write方法只是将数据写到8192字节数组当中,如果满了自动刷。
补充:
- a.没有Java7和Java9的新特性,怎么能始终执行close方法?
能嵌套try catch和if判断
b.进一步优化,创建一个CloseUtil工具
- try-with-resource
- 集合Properties工具类
(怎么打开一张图)
- Properties中load方法