Java IO简介

来源:互联网 发布:公共场所网络上报 编辑:程序博客网 时间:2024/06/05 16:25
流 分为字节流和字符流

字节流的父类是 InputStream 是一个抽象类,不可实例化
比较常用的子类有 FileInputStream 和 BufferedInputStream
都是通过字节读取,区别是BufferedInputStream 存在缓冲区,一次性读取较多的字节存放在缓冲区,读取文件的时候优先从缓冲区读,性能比FileInputStream好
BufferedInputStream 的构造方法中需要传入InputStream实例,一般传入FileInputStream实例

字符流的父类是Reader,同理也是一个抽象类,不可实例化
常见的子类有InputStreamReader
InputStreamReader是字节流通向字符流的桥梁,因为InputStreamReader的构造参数里面可以传入一个字节流的对象,InputStream。
InputStream的区别是一个字符一个字符读取,InputStreamReader的构造函数中可以设置字符集属性,防止在读取中文内容时乱码,
构造方法如下:
InputStreamReader(InputStream in, String charsetName)

FileReader是InputStreamReader的子类,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,在FileReader的
使用过程中会出现中文乱码,并不推荐使用

BufferedReader与InputStreamReader功能类似,构造方法是传入一个Reader,一般是传入InputStreamReader,
但是多了readLine方法,可以直接返回String类型的字符串,也有缓冲区的实现。

输出流
字节输出流的父类是 OutputStream 是一个抽象类,不可实例化
常见的子类有FileOutputStream,构造参数传入一个File即可。核心是write(byte b[])方法,write方法的主要作用是把byte数组写入文件中。如果需要在文件
的末尾追加内容,需要在FileOutputStream的构造参数append设为true,如下所示:
FileOutputStream fos = new FileOutputStream(f2, true);

BufferedOutputStream是最常见的字节输出流,同BufferedInputStream,它也存在一个缓冲区,在写文件时会先将字节写入缓冲区,然后再从缓冲区读。
需要注意的是,使用BufferedOutputStream有一个flush()方法,他的作用是强制输出缓冲流的内容

BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(bytes);
bos.flush();
bos.close();

在如上代码中,如果同时注释flush方法和close方法,那么输出流不会将内容输出到文件中,因为需要输出的内容还留在缓冲区中,如果加了flush方法,那么
缓冲区的内容会被强制输出到文件中,但是如果没加flush方法,写了close方法,结果同样也可以输出到文件中,这又是为什么呢,我们查看一下BufferedOutputStream 父类的
close方法后发现,close方法会调用fluse方法,如下所示:

public void close() throws IOException {
  try (OutputStream ostream = out) {
  flush();
  }
}

所以在平时使用BufferedOutputStream输出流时,要注意加上flush方法和close方法。需要注意的是,只有BufferedOutputStream有缓冲区的概念,例如FileOutputStream
是没有缓冲区的概念,但它仍然有flush方法,只是它的方法体内是空的,所以FileOutputStream的flush方法完全不做任何操作,在使用时不需要加上flush方法。

字节输出流的父类Writer类,是一个抽象类,不可实例化
Writer类的使用基本同OutputStream,区别是一个是字节输出,一个是字符输出。
OutputStreamWriter是字节流桐乡字符流的桥梁,因为它的构造参数中需要传入一个字节流,同时可以设置字符集属性,防止在输出中文内容时乱码 如下所示:

FileOutputStream fos = new FileOutputStream(f2, true);  //true表示在文件末尾追加
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");

OutputStreamWriter在使用write方法时也要注意加上flush方法和close方法(同BufferedOutputStream )

BufferedWriter是缓冲型输出流,它的构造方法需要传入一个Writer,不能直接指定字符集属性,需要通过传入的Writer指定,如下所示:

OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
BufferedWriter bw = new BufferedWriter(osw);

BufferedWriter使用方法基本同OutputStreamWriter,区别是缓冲区的大小不一样,BufferedWriter是继承了Writer类进行实现,而OutputStreamWriter是用StreamEncoder
进行实现。

附上测试代码和IO流介绍图:
public void test() throws IOException {        File f = new File("D://test.txt");        File f2 = new File("D://test2.txt");        if (f.exists()) {            //FileInputStream 字节输入流            FileInputStream fs = new FileInputStream(f);            byte[] bytes = new byte[1024];            int i = fs.read(bytes);            String str = new String(bytes, 0, i, "GBK");            System.out.println(str);            //BufferedInputStream 字节输入流,存在缓冲区,读取速度加快            FileInputStream fs2 = new FileInputStream(f);            BufferedInputStream bis = new BufferedInputStream(fs2);            byte[] bytes2 = new byte[1024];            int i2 = bis.read(bytes2);            String str2 = new String(bytes2, 0, i2, "GBK");            System.out.println(str2);            //InputStreamReader 字符输入流            InputStreamReader isr = new InputStreamReader(fs, "GBK");            char[] chars = new char[1024];            int is = isr.read(chars);            String strs = new String(chars, 0 ,is);            System.out.println(strs);            FileReader fr = new FileReader(f);            char[] charr = new char[1024];            int ir = fr.read(charr);            String strc = new String(charr, 0, ir);            strc = new String(strc);            System.out.println(strc);            //BufferedReader缓冲输入字符流            BufferedReader br = new BufferedReader(isr);            String string = "";            String line = "";            while ((line = br.readLine()) != null) {                string += line;            }            System.out.println(string);            FileOutputStream fos = new FileOutputStream(f2, true);            fos.write(bytes);            //fos.flush();            fos.close();            BufferedOutputStream bos = new BufferedOutputStream(fos);            bos.write(bytes);            bos.flush();            bos.close();            //OutputStreamWriter 字符输出流            OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");            osw.write(chars);            osw.flush();            osw.close();            BufferedWriter bw = new BufferedWriter(osw);            bw.write(chars);            bw.close();        }    }


原创粉丝点击