java缓冲流总结

时间:2022-01-25 21:00:36
//1、本程序没有缓冲区、将一个歌曲拷贝到另一份文件当中
import java.io.*;
public class zhang1
{
   public static void main(String[] args)  throws Exception
   {
       FileInputStream fr = new FileInputStream("C:\\Users\\Administrator\\Desktop\\北上广.mp3");
       FileOutputStream fw = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\北上广附件.mp3");
       
       int ch = fr.read();//将fr所关联的文件中读取一个字节放到i里面存放
       
       while(ch != -1)
       {
          fw.write(ch);//将读取的这个字节在放到fw所关联的那个文件当中
          ch = fr.read();//将fr所关联的文件中在继续读取一个字节放到i里面存放
       }
       
      fr.close();
      fw.close();
   }
}



//2、本程序虽然没有缓冲区、但是实际上存在着系统默认的缓冲区,最后通过flush一次性写入硬盘
import java.io.*;
public class zhang2
{
   public static void main(String[] args)  throws Exception
   {
       FileInputStream fr = new FileInputStream("C:\\Users\\Administrator\\Desktop\\北上广.mp3");
       FileOutputStream fw = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\北上广附件.mp3");
       
       int ch = fr.read();//将fr所关联的文件中读取一个字节放到i里面存放
       
       while(ch != -1)
       {
          fw.write(ch);//将读取的这个字节实际上先放到了系统默认的缓冲区里面,并没有放到fw所关联的那个硬盘文件里面
          ch = fr.read();//将fr所关联的文件中在继续读取一个字节放到i里面存放
       }
       
      fw.flush();//将缓冲区里面的数据一次性写入硬盘的文件当中
      
      fr.close();
      fw.close();
   }
}


//3、本程序通过缓冲流创建缓冲区,最后通过flush一次性写入硬盘
//本程序仅仅体现了   写这一步    的缓冲区的作用
import java.io.*;
public class zhang3
{
   public static void main(String[] args)  throws Exception
   {
       BufferedInputStream fr = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\北上广.mp3"));//子类对象可以发送给父类引用
       BufferedOutputStream fw = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\北上广附件2.mp3"));
       
       int ch = fr.read();//将fr所关联的文件中读取一个字节放到i里面存放,此时读缓冲区并没有起作用
       
       while(ch != -1)
       {
          fw.write(ch);//将读取的这个字节先放到fw的缓冲区里面,即一块内存空间里面,并没有放到fw所关联的那个硬盘文件里面
          ch = fr.read();//将fr所关联的文件中在继续读取一个字节放到i里面存放
       }
       
      fw.flush();//将缓冲区里面的数据一次性写入硬盘的文件当中
      
      fr.close();
      fw.close();
   }
}
//运行结果:缓冲区的建立明显节省了时间,打开歌曲之后已经全部复制完毕




//4、本程序通过缓冲流创建缓冲区,最后通过flush一次性写入硬盘
//本程序不但体现了   写这一步    的缓冲区的作用,并且通过数组缓冲区的创立,将写这一步的速度也进行的提高
//本程序可以完成所有文件的复制
import java.io.*;
public class zhang4
{
   public static void main(String[] args)  throws Exception
   {
       BufferedInputStream fr = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\北上广.mp3"));//子类对象可以发送给父类引用
       BufferedOutputStream fw = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\北上广附件3.mp3"));
       
       byte[] b = new byte[20000];//创建字符数组
       
       int len = fr.read(b); //前n-1次每一次从fr所关联的设备当中读取20000个字节先放到内存缓冲区,在放到b数组当中,最后一次应该比20000少
       
       while(len != -1)
       {
          System.out.printf("%d\n",len);//将每一次向b数组当中存放的字节数在显示器上输出
          fw.write(b,0,len);//将b数组中的字节先放到fw的缓冲区里面,即一块内存空间里面,并没有放到fw所关联的那个硬盘文件里面
          len = fr.read(b); //继续向b这个字符数组当中存放字节
       }
       
      fw.flush();//将缓冲区里面的数据一次性写入硬盘的文件当中
      
      fr.close();
      fw.close();
   }
}
//运行结果:读和写 缓冲区的建立明显节省了时间,打开歌曲之后已经全部复制完毕
/*
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
2583  最后一次存放的字节数变小
*/


//5、本程序通过缓冲流创建缓冲区,最后通过flush一次性写入硬盘
//本程序不但体现了   写这一步    的缓冲区的作用,并且通过数组缓冲区的创立,将写这一步的速度也进行的提高
//本程序仅仅是fw.write(b)发生了变化,这样写是不准确的,会将垃圾数据给写入进去,表现的结果就是歌曲后面重复唱了一段
//所以推荐写fw.write(b,0,len);
import java.io.*;
public class zhang5
{
   public static void main(String[] args)  throws Exception
   {
       BufferedInputStream fr = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\北上广.mp3"));//子类对象可以发送给父类引用
       BufferedOutputStream fw = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\北上广附件4.mp3"));
       
       byte[] b = new byte[250000];//创建字符数组
       
       int len = fr.read(b); //前n-1次每一次从fr所关联的设备当中读取200个字节放到b数组当中,最后一次应该比20000少
       
       while(len != -1)
       {
          System.out.printf("%d\n",len);//将每一次向b数组当中存放的字节数在显示器上输出
          fw.write(b);//将b数组中的字节先放到fw的缓冲区里面,即一块内存空间里面,并没有放到fw所关联的那个硬盘文件里面
          
          len = fr.read(b); //继续向b这个字符数组当中存放字节
       }
       
      fw.flush();//将缓冲区里面的数据一次性写入硬盘的文件当中
      
      fr.close();
      fw.close();
   }
}
//运行结果:读和写 缓冲区的建立明显节省了时间,打开歌曲之后已经全部复制完毕
/*
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
20000
2583  最后一次存放的字节数变小
*/