12.IO之字节流

 

,IO

1,IO

IO流用来处理设备之间的数据传输;IO就是输入(Input)和输出(Output),在学习java.io包汇总的一些类,这些类用来完成java程序中的输入输出工作

2,输入输出流

Java程序读取写出数据时,需要使用输入流和输出流

输入流(InputStream)用来读取数据,InputStream的子类可以从各种数据源中读取数据

输出流(OutputStream)用来写出数据,OutputStream的子类可以像各种数据目的地写出数据

3,FileInputStream读取文件

创建FileInputStream对象,关联一个文件

调用read()方法可以读取一个字节,如果读到末尾返回-1;

调用close()方法关闭流,释放资源;

4,FileOutputStream写出文件

创建FileOutputStream对象,关联一个文件,文件如果不存在就创建,文件存在则清空,如果需要追加,构造函数中多传一个true;

调用write()方法可以写出一个字节;

调用close()方法关闭流,释放资源;

5,拷贝文件;方式:

*1,逐个字节:使用FileputStream.read()FileOutputStream.write(int)

循环读取,读取到一个字节,判断是否是文件末尾,不是末尾就写出

由于操作文件速度较慢,逐个字节读取效率很低;

练习:

package cn.chunshentaike;

 

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class Fos {

 

       public static voidmain(String[] args) throws IOException {

              //创建输入流,关联file.txt

              FileInputStreamfis = new FileInputStream("file.txt");

              //创建输出流,关联test.txt

              FileOutputStreamfos = new FileOutputStream("test.txt",true);

              //定义变量

              int i;

              //使用输入流循环读取文件,如果不是文件末尾

              while((i= fis.read())!= -1)

                     //写入输出流中

                     fos.write(i);   

              //关闭流

              fos.close();

              fis.close();

             

       }

}

 

***2,自定义数组:使用FileInputStream.read(byte[]) FileOutputStream.write(byte[] ,int,int)

自定义一个数组当做字节缓冲区,一次拷贝一个数组(多个数据),一次写出一个数数组,减少了对文件的操作,提高了效率;

练习;

package cn.itcast;

 

import java.io.FileInputStream;

 

publicclass Homework2 {

   publicstaticvoid main(String[] args)throws IOException {

      // 创建输入流和输出流TODOAuto-generated method stub

      FileInputStreamfis = new FileInputStream("桃花庵歌.mp3");

      FileOutputStreamfos = new FileOutputStream("demo1.mp3");

      //创建数组,用来当做缓冲区,越大越快越占内存;

      byte[] b =newbyte[1024];

      //定义变量,用来记住每次读取多少个,

      int i;

      //定义时间,记录开始时间

      long time = System.currentTimeMillis();

      //从输入流中读取数据到b中,i记住读取多少个

      while((i=fis.read(b)) != -1)

         //将b中数据写出,写出i个

         fos.write(b,0,i);

      //记住结束时间

      long time1 = System.currentTimeMillis();

      //打印拷贝所用时间

      System.out.println(time1-time+"毫秒");//21毫秒

      fis.close();

      fos.close();

  

 

}

***3,自带缓冲区:使用BufferedInputStream.read()BufferedOutputStream.write(int);

Java提供了带有缓冲功能的类

使用BufferedInputStream.来读取一个字节,其内部会先读取一批进行缓冲,返回给程序一个,程序再读取时直接在缓冲区内读取,

使用BufferedOutputStream来写出一个字节,这个字节不会直接写出到文件,是写出到缓冲区中,直到缓冲区中写满或者关闭流时才会写到文件;

这样的机制减少了文件操作,提高效率;

import java.io.BufferedInputStream;

 

 

publicclass Homework3 {

   publicstaticvoid main(String[] args)throws IOException {

      //使用自带缓冲区输入,输出流;

      BufferedInputStreambis = new BufferedInputStream(new FileInputStream("桃花庵歌.mp3"));

      BufferedOutputStreambos = new BufferedOutputStream(new FileOutputStream("demo3.mp3"));

      int i;//定义变量,记住读取的个数;

      //

      long time = System.currentTimeMillis();

      //循环,

      while((i = bis.read())!=-1)

         bos.write(i);

      long time1 = System.currentTimeMillis();

      System.out.println("拷贝使用的时间是>>>"+(time1-time)+"毫秒");//拷贝使用的时间是>>>96毫秒

      bos.close();

      bis.close();

   }

 

}

 

 

6,标准化代码:

使用IO流的时候必须关闭流,而使用IO流的代码通常都是会抛出异常的,如果程序运行过程中某行代码出现异常,下面代码不会再执行;

为了避免关闭流的代码被异常中断,关闭流的代码都是写在finally代码块中的;

而如果有多个流需要关闭,每个关闭流的代码都要单独放在tryfinally,因为关闭流的代码通常也会抛出异常;

练习:

package cn.itcast;

 

import java.io.BufferedInputStream;

 

publicclass EncryptDemo {

 

   publicstaticvoid main(String[] args)throws IOException {

      // TODO Auto-generated method stub

      BufferedInputStreambis = null;

      BufferedOutputStreambos = null;

      try {

         bis= new BufferedInputStream(new FileInputStream("桃花庵歌.mp3"));

         bos= new BufferedOutputStream(new FileOutputStream("demo9.mp3"));

         int i;

         long start = System.currentTimeMillis();

         while((i = bis.read())!=-1)

            bos.write(i);

         long end = System.currentTimeMillis();

         System.out.println(end-start);

      finally {

         try {

            if(bis !=null)

                bis.close();

         }finally {

            if(bos !=null)

                bos.close();

         }

      }

     

   }

 

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值