• 第二十一天


    黑马程序员 <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. 重写方法,进行功能增强.
  • 相关阅读:
    POJ 3187 Backward Digit Sums
    POJ 3669 Meteor Shower BFS
    POJ 1979 Red and Black DFS
    不想切题、
    企业管理信息系统成功实施的四个阶段
    linux下memcached的安装
    Apache开启伪静态示例
    网页设计基础知识
    memcached安装说明
    伪静态.htaccess的练习
  • 原文地址:https://www.cnblogs.com/liman/p/4430783.html
Copyright © 2020-2023  润新知