黑马程序员--字节流

来源:互联网 发布:网络新词及意思和出处 编辑:程序博客网 时间:2024/04/25 17:09

一、字节流

InputStream

     |---FileInputStream:从文件系统中的某个文件中获得输入字节。

     |---FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。

      |---BufferedInputStream:该类实现缓冲的输入流。

     |---ObjectInputStream:对象流

     |---PipedInputStream:管道流

OutputStream

     |---FileOutputStream:文件输出流是用于将数据写入 File

     |---FilterOutputStream:此类是过滤输出流的所有类的超类。

      |---BufferedOutputStream:该类实现缓冲的输出流。

      |---PrintStream:

      |---DataOutputStream:

     |---ObjectOutputStream:

     |---PipedOutputStream:

字节流用于写入写出二进制文件。

FileOutputStream读取常用的方法

1读取单个字节:int read();

2将数据读入到数组中:int [ ]read(byte  buf)

3特殊方法:intavailable();方法可以不受阻塞地从此输入流中读取(或跳过)的估计余字节数;

FileOutputStream 字符输出常用的方法

方法:voidwrite(int b ); 将指定字节写入此文件输出流

复制一个图片文件:

public class Test5 {

    public static void main(String[] args){

    FileInputStream fis=null;

    FileOutputStream fos=null;

    try{

    //创建字节输入流对象

        fis=new FileInputStream("c:/test.jpg");

    //创建字节输出流对象

        fos=new FileOutputStream("d:/test.jpg");

        //定义缓冲区大小

        byte [] buf=newbyte[1024];

        int len=0;

      //通过循环读写,完成数据的存储

        while((len=fis.read(buf))!=-1){

            fos.write(buf,0,len);

        }

    }catch(IOException e){

 

        throw new RuntimeException("复制文件失败");

 

    }finally{

        try{

            if(fis!=null){

                fis.close();

            }

 

        }catch(IOException e){

            throw new RuntimeException("读取关闭失败");

        }

        try{

            if(fos!=null){

                fos.close();

            }

 

        }catch(IOException e){

            throw new RuntimeException("写入关闭失败");

        }

    }

}

}

 

二、字节流缓冲区

利用缓冲流拷贝MP3文件

public class Test6 {

    public static void main(String... args)throws IOException {

       //定义输入缓冲区

       BufferedInputStream is = new BufferedInputStream(new FileInputStream(

              "C:\\test.mp3"));

       //定义输出缓冲区

       BufferedOutputStream os = new BufferedOutputStream(

              new FileOutputStream("D:\\test.mp3"));

       for (int by = 0; (by = is.read()) != -1;) {

           os.write(by);

       }

       is.close();

       os.close();

    }

}

三、字节和字符转换流

字节和自己直接的转换使用转换流来完成,特别是设计到两种字符编码不同,就需要转换流完成编码方式的转换。

通过转换流从键盘读取数据:

public class Test7 {

    public static void main(String...args)throws IOException{

       BufferedReader bufr = new BufferedReader(new InputStreamReader(

              System.in));

       BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(

              System.out));

       for (String line =null; (line = bufr.readLine()) !=null;) {

           if ("over".equals(line))

              break;

           bufw.write(line);

           bufw.newLine();

           bufw.flush();

       }

       bufr.close();

       bufw.close();

    }

}

流操作的基本规律:

1.   明确源和目的

源:输入流  InputStream    Reader

目标:输出流  OutputStream   Writer

2.  操作的数据是不是纯文本

是:字符流;不是:字节流

四、IO流的使用到的装饰设计模式

1、当想要对已有对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能,那么该自定义类称为装饰类。
2
、装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的功能,提供更强的功能。

装饰和继承的区别:

继承的子类都具有父类的功能,装饰是对原来类功能的增强,不一定具有原来类的功能。装饰模式比继承灵活,Java中只能单继承,装饰模式避免了这个缺点。

 

0 0
原创粉丝点击