Java 带缓冲的字节流和字符流

输入流就是文件从硬盘到内存的中间媒介,那么输出流就是文件从内存到硬盘的中间媒介。首先来看看FileOutputStream的继承了哪些类,

java.lang.Object 

java.io.OutputStream 

java.io.FileOutputStream 

具体该类如何实现,我们还是结合以下代码来看。

import java.io.*;
public class FileOutputStreamTest01{
 public static void main(String[] args)throws Exception{
   FileOutputStream fos=null;
   try{
   //1.创建输出流
   fos=new FileOutputStream("temp02");
   //fos=new FileOutputStream("temp02",true);   以追加的形式写入
   //2.写入
   //准备要写入的字符串
   String str="hello,world!";
   //将字符串转换为byte类型
   byte[] bytes=str.getBytes();
   fos.write(bytes); //将byte数组中的所有内容写入
   //fos.wirte(bytes,0,3);
   //最后为了保证数据完全写入数组,刷新
   fos.flush();
   }catch(Exception e){
     e.printStackTrace();
   }finally{
     if (fos!=null){
     //关闭文件
     fos.close();
     }
     }
 }
}

1.首先创建输出流,FileOutputStream fos=new FileOutputStream("文件名");  这种形式的以覆盖方式输出,也就是你第一次写入一些内容,第二次再写入,打开后只能看见第二次写入的内容。那么如何以追加的形式写入呢?打开jdk帮助文档,我们找到FileOutputStream类,看里面的构造方法,

public FileOutputStream(String name, boolean append) throws FileNotFoundException

看jdk里的帮助文档的解释:创建文件输出流以指定的名称写入文件。 如果第二个参数是true ,则字节将写入文件的末尾而不是开头,也就是只要你写入内容到文件中,都会在文件保存。

2.来看写入的方法。jdk帮助文档中,write(byte[] b); 将 b.length个字节从指定的字节数组写入此文件输出流。程序中,首先准备要写入的字符串,String str="hello,world!"; 然后将字符串转换为数组形式,byte[] bytes=str.getBytes(); 使用write(byte[] b); 的方式写入。

3.安全起见,往文件里写入数据时都需要刷新,并且要记得关闭流。

这样,结合上一篇文章的内容,抽象类InputStream里的文件输入字节流和文件输出字节流的内容就介绍完了。文件输入字符流FileReader和文件输出字符流FileWriter与字节流的实现方式 大同小异,就不再细细地讲了。

在IO包中提供两个带缓冲的字节流,分别是BufferedInputStream和BufferdOutputStream,这两个流都使用了装饰设计模式。它们的构造方法中分别接收InputStream和OutputStream类型的参数作为被包装对象,在读写数据时提供缓冲功能。为了提高效率也可以定义一个字节数组作为缓冲区。在拷贝文件时,可以一次性读取多个字节的数据,并保存在字节数组中,然后将字节数组中的数据一次性写入文件。同样带缓冲的字符流BufferedReader和BufferedWriter实现的功能也相同。看以下带缓冲的字符输入流和输出流的实现方法。

带缓冲的字符输入流:

import java.io.*;
public class BufferedReaderTest01{
 public static void main(String[] args)throws Exception{
   //创建一个带有缓冲区的字符输入流
   FileReader fr=new FileReader("BufferedReaderTest01.java");
   //BufferedReader br=new BufferedReader(Reader);
   BufferedReader br=new BufferedReader(fr);
   //BufferedReader br=new BufferedReader(new FileReader("BufferedReaderTest01.java"));
    String temp=null;
   //按文本的一行开始读
   //br.readLine()读取读一行,但是行尾不带换行符
   while((temp=br.readLine())!=null){
     System.out.println(temp);
   }
   //关闭的时候只需关闭最外层的包装流
   br.close();
 }
}

带缓冲的字符输出流:

import java.io.*;
public class BufferedWriterTest01{
 public static void main(String[] args)throws Exception{
   BufferedWriter bf=new BufferedWriter(new FileWriter("temp004"));
   bf.write("奥运会!");
   bf.newLine();
   bf.write("体现了中国的传统文化");
   bf.close();
 }
}

字符流一次读入一个数组的速度明显比一次读入一个字符的速度快很多,这是加入了数组这样的缓冲区效果,Java本身在设计的时候,也考虑了这样的设计思想,所以提供了字节缓冲区流和字符缓冲区流。

搜索微信公众号“程序员考拉”,欢迎关注!

原文地址:https://www.cnblogs.com/naihuangbao/p/9444399.html