黑马程序员 <a href="http://www.itheima.com" target="blank">java培训</a>

                                                   第二十天

1.BufferedOutputStream写出数据

API:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统

上面的这段话说了两个事:

A.这个流它有缓冲区

B.它是一个复合流

BufferedOutputStream构造方法:

A.new BufferedOutputStream(OutputStream os)

B.new BufferedOutputStream(OutputStream os,int size)

注意:在开发中,我们一般不指定它的缓冲区大小,因为它默认的缓冲区基本够用。

public class BufferedInputStreamDemo1 {

    public static void main(String[] args) throws IOException {
        // 1.创建BufferedInputStream

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                "a.txt"));

        // 2.读操作
        // 可以 read() read(byte[] b)
        // 2.1 一个字节一个字节读
        // int code=-1;
        // while((code=bis.read())!=-1){
        // System.out.print((char)code);
        // }

        // 2.2 一次读取多个字节
        byte[] b = new byte[10];
        int len = -1;
        while ((len = bis.read(b)) != -1) {
            System.out.print(new String(b, 0, len));
        }

        // 3.关闭
        bis.close();
    }
}

 

2.BufferedInputStream读取数据

这个流用法与BufferedOutputStream类似,只还过它是一个输入流。

public class BufferedOutputStreamDemo1 {

    public static void main(String[] args) throws IOException {
        // 1.创建BufferedOutputStream

        // FileOutputStream fos = new FileOutputStream("a.txt");
        // BufferedOutputStream bos = new BufferedOutputStream(fos);

        // 上面代码可以简化
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("a.txt"));

        // 2.写操作
        // 它的写操作方法 write(int code) write(byte[] b)

        String s = "hello world";
        bos.write(s.getBytes());
        // bos.flush();
        // 3.关闭
        bos.close();  //close方法在执行前,会自动的进行flush

        // 问题:bos这个流,它包装了一个FileOutputStream,只关闭bos就可以了吗?
        // 当我们使用复合流(包装流),它们关闭时,会自动将底层包装的流也关闭。
    }
}

 

3.字节流四种方式复制视频并测试效率

第一种   FileInputStream FileOutputStream 一个字节一个字节操作  182619

第二种   FileInputStream FileOutputStream 一次操作多个字节   247

第三种  BufferedInputStream BufferedOutputStream 一个字节一个字节操作  71829

第四种 BufferedInputStream BufferedOutputStream 一次操作多个字节  148

 

4.转换流出现的原因及格式

OutputStreamWriter :它是字符到字节的桥梁

InputStreamReader:它是字节到字符的桥梁

 

这两个流是转换流,它们的作用:

        1.可以指定字符编码,进行操作。

2.这两个流是字节与字符流的桥梁

 

关于转换流的构造:

 

InputStreamReader的构造:

  1. new InputStreamReader(InputStream is);包装一个字节流
  2. new InputStreamReader(InputStream is,String charset)包装一个字节流并指定编码表。

OutputStreamWriter的构造:

  1. new OutputStreamWriter(OutputStream os)
  2. new OutputStreamWriter(OutputStream os,String charset)
    
    

     

5.String类中的编码和解码问题

常见编码表

UTF-8  它是一综合编码表,包含绝大部分国家的字符

GBK  GB2312  GB18030  中文

 ISO8859-1  西欧编码(拉丁)

 US-ASCII

BIG-5  繁体编码

 

 

6.转换流InputStreamReader的使用

    BufferedInputStream  BufferedOutputStream可以包装字节流,以提高读写效率。

public class InputStreamReaderDemo1 {

    public static void main(String[] args) throws IOException {
        // 1.创建流
        InputStreamReader isr = new InputStreamReader(new FileInputStream(
                "c.txt"), "UTF-8");
        // 2.读操作
        char[] ch = new char[10];
        int len = isr.read(ch); // 一次读取多个

        // 3.关闭
        isr.close();

        System.out.println(new String(ch, 0, len));
    }
}

 

7.字符缓冲输出流BufferedWriter的使用

BufferedWriter  BufferedReader它可以包装字符流,以提高读写效率。

BufferedWriter流,本身是字符输出流,它也是一个复合流,它不可以直接使用,必须包装一个Writer,也可以指定缓冲区,但是一般不需要,底层自带的缓冲区够用了.

构造方法:

       new BufferedWriter(Writer w);

       new BufferedWriter(Writer w,int size)

 

public class BufferedWriterDemo1 {

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

// 1.创建流
// BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));

// 要涉及到编码操作
FileOutputStream fos = new FileOutputStream("a.txt"); // 对a.txt文件操作的一个字节流
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); // 对fos进行了包装,使用的OutputStreamWriter是一个字符流
BufferedWriter bw = new BufferedWriter(osw); //对osw进行了包装,BufferedWriter它的参数需要的是字符流
// 2.写操作
bw.write("我是一个好人");
bw.flush();
// 3.关闭
bw.close();
}
}

 

 

 

8.字符缓冲输入流BufferedReader的使用

它是用于对Reader流进行包装的,它可以提高读取效率。

       方式1:可以一个字符一个字符复制

       方式2:一次操作多个字符.

//使用BufferedReader来读取a.txt文件中内容
public class BufferedReaderDemo1 {

    public static void main(String[] args) throws IOException {
        // 1.创建流
        // BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream("a.txt"), "utf-8"));
        // 2.读操作
        char[] ch = new char[10];
        int len = br.read(ch);
        System.out.println(new String(ch, 0, len));
        // 3.关闭
        br.close();
    }
}

 

9.字符缓冲流的特殊功能

BufferedReader提供的特殊方法:

public String readLine();一次读取一行,如果返回null,代表读到文件末尾。

读取到的数据中不包含换行符.

BufferedWriter提供的特殊方法

public void newline();写入一个换行符.

 

public class BufferedReaderDemo2 {

    public static void main(String[] args) throws IOException {
        // 1.创建流
        BufferedReader br = new BufferedReader(new FileReader("b.txt"));
        // 2.读操作
        // String line = br.readLine();
        // System.out.println(line);
        //
        // String line1 = br.readLine();
        // System.out.println(line1);
        //
        // String line2 = br.readLine();
        // System.out.println(line2);
        //
        // String line3 = br.readLine();
        // System.out.println(line3);
        
        String line=null;
        
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
        // 3.关闭
        br.close();
    }
}

 

10.IO流小结图解

 

11.复制文本文件的5种方式案例

       第一种 FileReader FileWriter   一次读取一个字符操作

       第二种 FileReader FileWriter  一次读取多个字符操作

       第三种 BufferedReader  BufferedWriter一次读取一个字符操作

       第四种 BufferedReader  BufferedWriter 一次读取多个字符操作

       第五种BufferedReader  BufferedWriter 一次读取一行进行操作

 

       不有其它的:

  1. 使用字节流操作可不可以。
  2. 使用转换流操作

12.复制图片的4种方式案例

       第一种  FileInputStream FileOutputStream 一次一个字节

       第二种 FileInputStream FileOutputStream 一次多个字节

       第三种  BufferedInputStream BufferedOutputStream 一次一个字节

       第四种 BufferedInputStream BufferedOutputStream 一次多个字节

 

 

 

13.装饰设计模式

问题:什么是装饰设计模式,它的作用是什么?

装饰设计模式可能解决的问题是功能的增强.

我们现在学习过的技术,可以通过继承进行重写的方式来对功能增强。

继承这种方案可以实现功能增强,但是会出现体系结构越来越庞大问题。(类爆炸)

 

对于以上的问题,我们可以使用装饰设计模式来解决。

 

步骤:

  1. 装饰类与被装饰要实现同一个接口或继承同一个父类.
  2. 装饰类中要持有一个被装饰类的引用。
  3. 重写方法,进行功能增强.

 

posted on 2015-04-16 00:44  星之钥匙  阅读(102)  评论(0编辑  收藏  举报