天天看点

(三)IO流——缓冲字节流、缓冲字符流、转换流

缓冲流也就是对4个基本的FileInputStream、FileOutputStream、FileReader、FileWriter流的增强

相当于在传输流文件时,将资源放入缓冲区数组中

待缓冲区数组满了,或者调用了flush()方法或close()方法关闭流的话

缓冲区数组才会将内容转职目标文件或程序中

通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

(三)IO流——缓冲字节流、缓冲字符流、转换流

字节缓冲流

public BufferedInputStream(InputStream in)                                           创建一个字节缓冲输入流对象

public BufferedOutputStream(OutputStream out)                                  创建一个字节缓冲输出流对象

File f1 = new File("c.txt");
File f2 = new File("d.txt");
FileInputStream fis = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
           

字节缓冲流的构造方法,与普通字节不一样,传入的参数是InputStream、OutStream对象

常用FileInputStream、FileOutputStream作参数创建

若想使用字节缓冲输出流完成续写,需创建OutputStream对象时,参数加上true

字节缓冲流的方法与FileInputStream、FileOutputStream一模一样

具体参考:https://blog.csdn.net/weixin_42022555/article/details/81774681

仅是在传输流文件过程中,先将文件放在缓冲区数组中以提高传输效率

由于缓冲区字节流的文件字节都是保存在缓冲区数组中,

所以在需要提前拿到缓冲区数组中的数据时,

需要调用flush()方法将缓冲区数组输入或输出到该去的地方

或者在不需要使用该缓冲流对象时可以直接调用close()方法关闭流对象

close()方法也有一个刷新缓冲区数组的操作并且关闭流

字符缓冲流

public BufferedReader(Reader in)                                                 创建一个字符缓冲输入流对象

public BufferedWriter(Writer out)                                                  创建一个字符缓冲输出流对象

File f1 = new File("c.txt");
File f2 = new File("d.txt");
FileReader fr = new FileReader(f1);
FileWriter fw = new FileWriter(f2);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
           

缓冲字符流的构造方法与缓冲字节流的类似,也是传入Reader、Writer对象作参数创建对象

若想使用字符缓冲输出流完成续写,需在创建Writer对象时,参数加上true

字符缓冲流的方法与Writer、Reader方法一模一样,可是各自都多了一个特有方法

BufferedReader特有方法:

public  String  readLine ()                                                                          读取一行文字内容,返回该行字符串

BufferedReader br = new BufferedReader(new FileReader("c.txt"));
String str = br.readLine();
System.out.println(str);
br.close();
           

BufferedWriter特有方法:

public  void  newLine ()                                                                               输出一个换行符

BufferedWriter bw = new BufferedWriter(new FileWriter("d.txt"));
bw.newLine();
bw.close();
           

有了BufferedReader的读取一行文字方法,获取一整个文本内容的效率就可以比以前一个字符一个字符读取更快了

BufferedReader br = new BufferedReader(new FileReader("c.txt"));
String str = null;
while ((str = br.readLine())!=null){
    System.out.println(str);
}
br.close();
           

在计算机中存储的所有信息其实都是用二进制(01010101)表示的

之所以能在屏幕上看到不一样的文字数字英文等,是因为二进制通过码表转换而成的

编码:按照某种规则,将字符存储到计算机中

解码:将存储在计算机中的二进制数据按照某种规则解析出来

若编码和解码的使用的码表不相同,则会出现我们常见的乱码

目前开发工具IDEA默认使用的是UTF-8码表,而计算机文本默认是以GBK进行编码

所以使用IDEA开发工具调用IO流查看,在记事本中编写好的文本会是乱码(因为编码是GBK码表,解码是UTF-8)

转换流:

(三)IO流——缓冲字节流、缓冲字符流、转换流

由图可见,转换流就是字节流与字符流之间的桥梁:

在使用OutputStreamWriter转换流时,是以字符的形式获取到代码上的字符输出对象

可是转换流会拿着这些字符去找对应的码表并以二进制的形式输出到目标文件中

字符转换输出流,继承Writer类,是字符通向字节的桥梁

而InputStreamReader转换流,则是先以字节输入的形式取到目标文件的所有字节

并拿着这些二进制字节对应相应的码表,以字符的形式输入到java程序中

字符转换输入流,继承Reader类,是字节通向字符的桥梁

OutputStreamWriter类:

OutputStreamWriter(OutputStream in)                                                         创建使用默认字符集的字符转换输出流对象

File f = new File("c.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos);
           

默认的字符集码表使用的是UTF-8

OutputStreamWriter(OutputStream in, String charsetName)                  创建指定字符集的字符转换输出流对象

File f = new File("c.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
           

字节输出流对象作为参数

OutputStreamWriter的使用方法与FileWriter的使用方法一模一样

InputStreamReader类:

InputStreamReader(InputStream in)                                                   创建使用默认字符集的字符转换输入流对象

File f = new File("d.txt");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
           

InputStreamReader(InputStream in, String charsetName)           创建使用指定字符集的字符转换输入流对象

File f = new File("d.txt");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
           

InputStreamReader的使用方法与FileReader的使用方法一模一样

这样就不用担心在计算机记事本上写好的GBK编码内容,在开发工具上读取出来是乱码

File f = new File("b.txt");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
int len = 0;
while ((len = isr.read()) != -1) {
    System.out.println((char) len);
}
isr.close();
           

继续阅读