第二十一天

黑马程序员 <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. 重写方法,进行功能增强.
时间: 2024-12-25 04:33:13

第二十一天的相关文章

iOS 进阶 第二十一天(0531)

0531 - Autolayout 不仅可以做屏幕适配还可以做系统适配 uidynamic 做物理动画.能做的效果如下图: Autolayout Autolayout 是一种“自动布局”技术,专门用来布局UI界面的.有了Autolayout,请忘记frame Autolayout 要比 Autoresizing 强大,两者水火不相容 Autolayout的2个核心概念 参照 约束 使用代码实现Autolayout - VFL(Visual Format Language) 实现思路如下: NSL

0505.Net基础班第二十一天(基础加强总复习)

1.取消播放器的自动播放功能 2.播放或者暂停按钮 3.下一曲.上一曲 4.多选删除 5.静音和放音 6.选择列表中的音乐文件,单击播放按钮直接播放 7.自动进行下一曲 15秒  44秒 当我和世界不一样 44.--47 那就让我不一样 lblInfomation.Text = musicPlayer.currentMedia.duration.ToString() + "\r\n" + musicPlayer.currentMedia.durationString + "\

javaSE第二十一天

第二十一天????276 1:字符流(掌握)????276 (1)字节流操作中文数据不是特别的方便,所以就出现了转换流.????276 (2)转换流其实是一个字符流????276 1:InputStreamReader(转换流)????276 2:OutputStreamWriter(转换流)????277 (3)编码表????279 (4)IO流中的编码问题????280 A:OutputStreamWriter(转换流)????280 B:InputStreamReader(转换流)????

手把手教你做关键词匹配项目(搜索引擎)---- 第二十一天

客串:屌丝的坑人表单神器.数据库那点事儿 面向对象升华:面向对象的认识----新生的初识.面向对象的番外----思想的梦游篇(1).面向对象的认识---如何找出类 负载均衡:负载均衡----概念认识篇.负载均衡----实现配置篇(Nginx) 吐槽:现在欠的文章有面向对象的认识----类的转化.面向对象的番外---思想的梦游篇(2).负载均衡 ---- 文件服务策略.手把手教你做关键词匹配项目(搜索引擎).真心太多了,能不能让我休息一会儿. 第二十一天 起点:手把手教你做关键词匹配项目(搜索引擎

课程设计第二十一天,09.08

1.今日完成: (1)分析完成一个超市微信小程序代码案例: (2)上传代码到gitlab上的远程仓库,截至今日已经完成了五次项目代码的更新. (3)今日份的代码只做了简单的改动,部分优化. 2.明日计划: (1)继续优化代码,尽量完成数据的增.删.改三大功能. (2)课程设计结课报告的初步构想. (3)上传项目代码,坚持运动. 3.今日总结: (1)这段时间分析了很多微信小程序案例,对微信小程序开发有了进一步的了解以及应用. (2)最后一周没什么大改动了,主要事优化和结课报告. (3)跑步十圈+

创业的第二十一天

住家里真的挺多事操心的,很多事情都让我分心,有点累. 最近公司的软件被破解了,这款软件是一款PC软件,我们盈利方式是通过操作PC软件时向服务器发起请求,然后扣除积分,积分不够了就向我们购买.最近有个购买我们软件的客户自己通过截取我们的服务器包来模拟了一个服务器,然后再兜售给其他客户. 说实话,我早就料到有这一天了,只是没想过会这么久才被破解.因为当时我设计协议包的时候并没有加入一些变化的东西,比如密钥之类的.当时觉得应该是挺好破解的,只是没想到可以怎么破解,毕竟在这方面我也没什么经验,也算是留个

二十一天

今天做了表单,还做了单双行分颜色. var arr = [ ["周更生","男",30,true,"大专",5000,500,,"山东省"], ["刘晓庆","女",26,false,"研究生",8000,1500,"北京科技大学","山西省"], ["习近","男",38,true,&q

再回首Java第二十一天

DOM和SAX解析技术的实现 实现DOM和SAX即系技术的方法有多种,下面列出了常用的几种方法 JAXP(Java API for XML:JAXP是对应用程序隐藏了特定解析器的接口,它提供了访问DOM和SAX实现的抽象层机制 JDOM:JDOM是一种使用XML的独特Java工具包,用于快速开发XML应用程序,它基于树型结构,利用纯Java的技术对XML文旦实现解析.生成.序列化以及多种操作.JDOM直接为Java编程服务.它利用更为请有力的Java语言的诸多特性(方法重载.集合概念以及樱色),

【Objective-C学习记录】第二十一天

温故而知新,继续复习. OC中可以通过声明属性来省略setter和getter,达到让代码简洁的目的.使用属性时,不需要在接口和m文件中进行实例变量的声明和setter getter的实现,系统会自动提供这些,但是如果在接口部分自定义了实例变量,那么将以自定义的为准,系统不会生成实例变量. 语法:采用@property关键字,并且@property不是变量,是方法. 命名:属性名不加下划线,只有实例变量才有下划线. 属性是一对setter和getter方法,属性类型是setter方法中的参数类型

第四百二十一天 how can I 坚持

给lcj买票了,希望不要事与愿违啊. 加了一天班.. 感觉最近没什么可写的了呢,或者抱怨,或者什么的,就是有个想法也行,但是感觉那么平静呢. 早上走的时候给老翟打电话,本来想让他下班去我公司拿请他吃个饭呢,没想到..他也加班.. 好想laopo啊.感觉有点太依赖别人了,不好,得改变. 睡觉.