IO流介绍
-
IO流是一个流水模型:IO理解成水管,把数据理解成水流
-
IO流的分类:
- 按照流的方向分为:输入流、输出流
- 按照流的内容分为:字节流、字符流
IO流的体系
文件字节流的使用
FileInputStream
- 作用:以内存为基准,把磁盘文件中的数据按照字节的形式读入到内存中的流。
- 构造器:
public FileInputStream(File path)//创建一个字节流输入管道与源文件对象接通
public FileInputStream(String pathName) // 创建一个字节输入流管道与文件路径对接
pubic int read() //每次读一个字节返回,读取完返回-1
public int read(byte[] beffer)//从字节输入流中读取字节到字节数组中,返回字节的数量,没有字节返回-1
- 问题:利用字节流读入数据时,会存在中文字符字节被割裂的问题。因此,字节流并不适合文本文件内容输出。针对小文件,在JDK1.9之后,存在一个解决方案:
public class FileInputStreamDemo03 {
public static void main(String[] args) throws Exception {
// 0.定位文件对象
File f = new File("src/dlei03.txt");
// 1.定义一个字节输入流通向源文件路径,简化写法!
InputStream is = new FileInputStream(f);
// 2.定义一个字节数组与文件的大小刚刚一样大
byte[] buffer = is.readAllBytes();
String rs = new String(buffer);
System.out.println(rs);
}
}
FileOutputStream
- 以内存为基准,把内存中的数据,按照字节的形式写出到磁盘文件中去。简单来说,把内存数据按照字节写出到磁盘文件中去。
- 构造器
public FileOutputStream(File file):创建一个字节输出流管道通向目标文件对象。
public FileOutputStream(String file):创建一个字节输出流管道通向目标文件路径。
public FileOutputStream(File file , boolean append):创建一个追加数据的字节输出流管道通向目标文件对象。
public FileOutputStream(String file , boolean append):创建一个追加数据的字节输出流管道通向目标文件路径。
public void write(int a):写一个字节出去 。
public void write(byte[] buffer):写一个字节数组出去。
public void write(byte[] buffer , int pos , int len):写一个字节数组的一部分出去。参数一,字节数组;参数二:起始字节索引位置,参数三:写多少个字节数出去。
public class OutputStreamDemo04 {
public static void main(String[] args) throws IOException {
// 1. 创建一个文件对象定位目标文件
File file = new File("src/dlei04.txt");
// 2. 创建一个字符输出流管道与目标文件对象接通
OutputStream os = new FileOutputStream(file);
// 3. 写数据
// a.写一个字节出去
os.write(97); // 字节a
os.write('b');
os.write('吴'); // 只会写出中文的第一个字节,会发生乱码
// os.flush(); // 立即刷新数据到文件中,刷新后管道可以继续使用
// b.写一个字节数组出去
byte[] bytes = new byte[]{98,99,100,111,104};
os.write(bytes);
os.write("\r\n".getBytes());
byte[] bytes1 = "今天晚上吃什么饭啊".getBytes();
os.write(bytes1);
os.close(); // 关闭资源管道,关闭包含了刷新,关闭后管道不能使用
}
}
字符流的使用
FileReader
- 作用:以内存为基准,把磁盘文件的数据以字符的形式读入到内存。
- 构造器:
public FileReader(File file):创建一个字符输入流与源文件对象接通。
public FileReader(String filePath):创建一个字符输入流与源文件路径接通。
public int read(): 读取一个字符的编号返回! 读取完毕返回-1
public int read(char[] buffer):读取一个字符数组,读取多少个字符就返回多少个数量,读取完毕返回-1
FileWriter
- 以内存为基准,把内存中的数据按照字符的形式写出到磁盘文件中去
- 构造器
public FileWriter(File file):创建一个字符输出流管道通向目标文件对象。
public FileWriter(String filePath):创建一个字符输出流管道通向目标文件路径。
public FileWriter(File file,boolean append):创建一个追加数据的字符输出流管道通向目标文件对象。
public FileWriter(String filePath,boolean append):创建一个追加数据的字符输出流管道通向目标文件路径。
public void write(int c):写一个字符出去
public void write(String c)写一个字符串出去:
public void write(char[] buffer):写一个字符数组出去
public void write(String c ,int pos ,int len):写字符串的一部分出去
public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
缓冲流
- 作用:缓冲流可以提高字节流和字符流的读写数据的性能
- 分类:
-
BufferedInputStream:字节缓冲输入流,可以提高字节输入流读数据的性能。
-
BufferedOutStream:字节缓冲输出流,可以提高字节输出流写数据的性能。
-
BufferedReader:字符缓冲输入流,可以提高字符输入流读数据的性能。
-
BufferedWriter: 字符缓冲输出流,可以提高字符输出流写数据的性能。
BufferedInputStream
- 作用:可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的能力
- 构造器
public BufferedInputStream(InputStream in)
- 原理:缓冲字节输入流管道自带一个8kb的缓冲池,每次可以直接借用操作系统的功能最多提取8KB的数据到缓冲池中去,以后我们直接从缓冲池读取数据,所以性能较好。
BufferedOutputStream
- 作用与BufferedInputStream相反,原理类似。
- 同样还包括,BufferedWriter和BufferedReader也是这样,就不具体来说。