天天看点

java中输入流和输出流

 输入流InputStream和输出流OutStream是抽象方法,不能被实例化,它们还有很多子类

 输入流InputStream的常用方法

 int read()从输入流读取一个八位的字符,把它转换为0~255之间的整数,并返回这一整数

 int read(byte【】 b) 从输入流读取若干字节,把他们保存到参数b自定的字节数组中,返回的整数表示读取字节数

 int read(byte【】b,int off,int len) 从输入流读取若干字节,把他们保存到参数b自定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目

 void close() 关闭输入流并释放与该流关联的所有系统资源

 输出流OutStream的常用方法

 void write(int b)向输入流写入一个字节

 viod write(byte【】b)把参数b指定的字节数组的所有字节写到输出流

 void write(btye【】b,int off,int len)将指定byte数组中从偏移量off开始的len个字节写入输出流

 void fush() 刷新此输出流并强制写出所有缓冲的输出字节   

 viod colse()

 FileInputStream和FileOutputStream针对文件的读写

 FileInputStream是InputStream的子类

 在test.txt文件中输入itcast

 import java.io.*;

 public class Example{

  public static void public static void main(String[] args)throws Exception{

    //创建一个文件字节输入流

    FileInputStream in =new FileInputStream("test.text");

    int b=0;   //记住每次读取的一个字节

    while(true){

      b=in.read();

      if(b==-1){

  break;

}

System.out.println(b);

    }

    in.colse();

  }

 }

 因为itcast各占一个字节,因此最终显示的就是文件test.txt中的六个字节所对应的十进制数

 与FileInputStream对应的是FileOutputStream(文件输出流)

 import java.io.*;

 public class Example{

  public void public static void main(String[] args) throws Exception{

  //创建一个文件字节输出流

  FileOutputStream out=new FileOutputStream("Example.txt);

String str="测”;

byte []b=str.getBytes();

for(int i=0;i<b.length;i++){

  out.write(b[i]);

}

out.close();//如果像一个已经存在的文件写入数据,那么该文件的数据首先被清空,若希望增加新的内容,则可以使用构造函数FileOutputStream(String fileName,booelan append)来创建文件输出流对象,并将append的参数设为true;

  }

 }

 最后通常将关闭流的操作写在finally{}代码块中

 finally{

 try{

 if(in!=null){

  in.close();

 }catch(Exception e){

  e.printStackTrace();

}

try{

  if(out!=null){

    out.colse()

  }catch(Exception e){

  e.printStackTrace();

}

}

 }

 }

 文件的拷贝

 首先在当前目录下创建文件夹source和target,然后再source文件夹下放一个“天下。MP3”的文件

 import java.io.*;

 public class Example{

  public static void public static void main(String[] args) throws Exception{

  //创建一个字节输入流,用于读取当前目录下sourc文件夹中的MP3文件

  InputStream in=new FileInputStream("source\天下.mp3");

  //创建一个文件字节输出流,用于将读取的字节写入target目录下的文件中

  outputStream  out=new FileInputStream("target\天下.mp3");

  int len;//记住每次读取的一个字节

 Long begintime=System.currentTimeMillis();//获取拷贝文件前的系统时间

    while((len=in.read())!=-1){

      out.write(len);

    }

    Long endtime=System.currentTimeMillis();//获取文件拷贝结束时系统时间

    System.out.println("拷贝文件消耗的时间是"+endtime-begintime);

    in.colse();

    out.colse();

  }

 }

以上是单个字节的读取,在拷贝文件时,可以一次性读取多个字节的数据,并保存在字节数组中,然后将字节数组中的数据一次性写入文件。

  import java.io.*;

 public class Example{

  public static void public static void main(String[] args) throws Exception{

  //创建一个字节输入流,用于读取当前目录下sourc文件夹中的MP3文件

  InputStream in=new FileInputStream("source\天下.mp3");

  //创建一个文件字节输出流,用于将读取的字节写入target目录下的文件中

  outputStream  out=new FileInputStream("target\天下.mp3");

//以下是用缓冲区读写文件

  byte[] butt=new byte[1024];//定义一个字节数组,作为缓冲区

    int len;//记住读取读入缓冲区的字节数

    Long begintime=System.currentTimeMillis();//获取拷贝文件前的系统时间

    while((len=in.read(buff))!=-1){//判断是否读到文件末尾

      out.write(buff,0,len);//从第一个字节开始,向文件写入len个字节

    }

    Long endtime=System.currentTimeMillis();//获取文件拷贝结束时系统时间

    System.out.println("拷贝文件消耗的时间是"+endtime-begintime);

    in.colse();

    out.colse();

  }

 }

 字节缓冲流

 在IO包中提供两个带缓冲的字节流,BufferedInputStream和BufferdOutputStream

  import java.io.*;

 public class Example{

  public static void public static void main(String[] args) throws Exception{

  //创建一个带缓冲去的输入流

  BufferedInputStream bis=new BufferedInputStream( new FileInputStream("source\天下.mp3"));

  //创建一个带缓冲区的输出流

  BufferdOutputStream  bos=new BufferdOutputStream(new FileInputStream("target\天下.mp3"));

  int len;//记住每次读取的一个字节

    Long begintime=System.currentTimeMillis();//获取拷贝文件前的系统时间

    while((len=bis.read())!=-1){

      bos.write(len);

    }

    Long endtime=System.currentTimeMillis();//获取文件拷贝结束时系统时间

    System.out.println("拷贝文件消耗的时间是"+endtime-begintime);

    in.colse();

    out.colse();

  }

 }

 这两个流内部都定义了一个大小为8192的字节数组