JavaIO 总结笔记<四> 缓冲流和转换流

个人博客个人简书gitHub主页

一、缓冲流

1.缓冲区 基本字节流没有缓冲区 基本字符流有缓冲区(8K)

2.对于基本字节流,Java后来提供了字节流的缓冲流和字符流的缓冲流

3.缓冲流

java.io.BufferedInputStream    字节缓冲流(读)
java.io.BufferedOutputStream    字节缓冲流(写)
java.io.BufferedReader   字符缓冲流(读)
java.io.BufferedWriter   字符缓冲流(写)

二、BufferedOutputStream类

1.作用 把内存中的数据写入到硬盘的某个文件中(有缓冲区)

2.构造方法

public BufferedOutputStream(OutputStream out)   默认大小是8k
public BufferedOutputStream(OutputStream out,  int size)可以自己指定缓冲区大小,单位字节

3.功能方法

public void write(int b)  参数是ASCII表中的码值,不是普通数字
public void write(byte[] b)
public void flush() 

代码举例:

    public static void writeFileByBufferByte() throws IOException {
        //演示BufferedOutputStream类

        //1.建管道
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(fileName_destination));
        //BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("demo.txt"),32*1024);

        //2.写数据
        bos.write(97);
        bos.write("\r\nhello你好".getBytes("GBK"));

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

三、BufferedInputStream类

1.作用 把硬盘中某个文件的数据读取到内存中(有缓冲区)

2.构造方法

public BufferedInputStream(InputStream in)  默认缓冲区是8k
public BufferedInputStream(InputStream out,  int size)可以自己指定缓冲区大小,单位字节

3.功能方法

public int read()
public int read(byte[] b)
public void close()

代码举例:

    public static void readFile() throws IOException {
        //演示BufferedInputStream类

        //1.建管道
        File f = new File(fileName_source);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
        //BufferedInputStream  bis=new BufferedInputStream(new FileInputStream("demo.txt"),32*1024);

        //2.读取数据
//      public int read()   一次读取一个字节并返回,如果到文件最后了,返回-1
        int res;
        do {
            res = bis.read();
            System.out.print((char) res);
        } while (res != -1);

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

    public static void readFileByBufferByte() throws IOException {
        //演示BufferedInputStream类

        //1.建管道
        File f = new File(fileName_source);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
        //BufferedInputStream  bis=new BufferedInputStream(new FileInputStream(fileName_source),32*1024);

        //2.来辆车
        byte[] t = new byte[(int) f.length()];

        //3.装车
        bis.read(t);
        System.out.println(new String(t));

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

四、复制文件

在实际开发时,对于较大文件的复制,推荐使用缓冲流


    public static void copy03_BufferIOStream() throws IOException {
        //使用字节缓冲流复制文件

        //1.建两个管道
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fileName_source));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(fileName_destination));

        //2.来辆车
        byte[] t=new  byte[8*1024];

        //3.边读边写
        while(true){
            int res=bis.read(t);
            if(res==-1)
                break;
            bos.write(t, 0, res);
        }

        //4.关闭
        bis.close();
        bos.close();
    }

五、BufferedWriter类

1.作用 把内存中的数据写入到硬盘的某个文件中(缓冲区的大小是可以自己设置的)

2.构造方法

public BufferedWriter(Writer out)   默认大小是8k
public BufferedWriter(Writer out,  int sz)可以自己指定缓冲区大小,单位字节

3.功能方法

public void write(char[] cbuf)
public void write(String str)
public void newLine()   \r\n   特有方法,优势是跨平台
public void flush()  
public void close()

代码举例:

    public static void writeFile() throws IOException {

        //演示BufferedWriter类

        //1.建管道
        BufferedWriter bw=new BufferedWriter(new FileWriter(fileName_destination));
        //BufferedWriter bw=new BufferedWriter(new FileWriter("fileName_destination"),16*1024);

        //2.写数据
        bw.write("hello");
        bw.newLine();    //跨平台
        bw.write("world 你好世界");

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

    }

六、BufferedReader类

1.作用 把硬盘中某个文件的数据读取到内存中(缓冲区的大小可以自己设置)

2.构造方法

public BufferedReader(Reader in)   默认大小是8k
public BufferedReader(Reader in,  int sz)可以自己指定缓冲区大小,单位字节

3.功能方法

public int read()
public int read(char[] cbuf)
public String readLine()    特有方法   碰到换行或回车即一行结束
public void close()

    public static void readFile() throws IOException {

        //演示BufferedReader类

        //1.建管道
        BufferedReader br=new BufferedReader(new FileReader(fileName_source));
        //BufferedReader br=new BufferedReader(new FileReader("fileName_source"),16*1024);

        //2.独有方法
        String s;
        do {
            s=br.readLine();
            System.out.println(s);
        } while (s!=null);

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

七、转换流

1.所有文件最终都是以字节形式存储在硬盘上,但是用户在读写时需要的是字符,因此字符和字节之间需要互相转换。
字节到字符是读(输入流),字符到字节是写(输出流)。

2.转换时需要按照某种字符编码进行转换,常见的编码有:ISO-8859-1(西方字符) UTF-8(国际通用标准) GBK(中国国家标准)

3.在UTF-8编码标准中,一个汉字占三个字节;在GBK编码标准中,一个汉字占两个字节(请使用Eclipse更改文件编码格式)

4.中文Win操作系统默认编码GBK,Java中的char和String在存储汉字时采用GBK编码

5.当文件的编码跟系统默认编码不一致时,就会出现中文乱码问题,就需要用到Java的转换流来解决

6.InputStreamReader 是字节流通向字符流的桥梁,起到转换作用(读)

OutputStreamWriter 是字符流通向字节流的桥梁,起到转换作用(写)

7.思考:今天要讲的转换流需要读写文件?之前讲的基本流已经有了读写文件的功能?那么转换流还需要自己再实现读写文件的功能吗?

八、InputStreamReader类

1.作用 读取 输入流 把硬盘上某个文件的二进制字节数据转换为字符

2.构造方法

public InputStreamReader(InputStream in)   默认字符编码GBK
public InputStreamReader(InputStream in,  String charsetName)可以自己指定编码(要跟文件编码一致)

3.功能方法

public int read()
public int read(char[] cbuf)

代码举例:


    public static void readByInputStreamReader() throws IOException {
        //演示InputStreamReader类     从字节转换为字符

        //1.建管道
        File f = new File(fileName_source);
        InputStreamReader isr=new InputStreamReader(new FileInputStream(f),"UTF-8");

        //2.来辆车
        char[] c=new char[(int)f.length()];

        //3.装车
        isr.read(c);
        System.out.println(new String(c).trim());
        //4.关闭
        isr.close();

    }

九、OutputStreamWriter类

1.作用 写 输出流 把字符转换为字节存到硬盘上

2.构造方法

public OutputStreamWriter(OutputStream out)  默认字符编码GBK
public OutputStreamWriter(OutputStream out,  String charsetName)可以自己指定编码(要跟文件编码一致)

3.功能方法

public void write(int c)
public void write(char[] cbuf)
public void write(String str)

public void flush()
public void close()

代码举例:


    public static void writeByOutputStreamWriter() throws IOException {
        //演示OutputStreamWriter类      把字符转换为字节

        //1.建管道
        OutputStreamWriter osw  = new OutputStreamWriter(new FileOutputStream(fileName_destination),"UTF-8");

        //2.写数据
        osw.write("中国");

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

    }

十、另一种解决中文乱码文件的方式

1.先打回原形

2.重新组合成字符串,可以设置编码

十一、基本流、缓冲流和转换流

用基本字节流读写文本文件,也需要在字节和字符之间转换,getBytes() new String()

用基本字符流读写文本文件,也需要在字节和字符之间转换,字符流的爸爸是转换流

十二、总结基本流、缓冲流和转换流的应用场景?

1.基本流 文件小 编码是gbk

2.缓冲流 文件大

3.转换流 编码跟系统不一致

十三、装饰设计模式

1.如果我想在不改变某类源代码的前提下,扩展该类中某个方法的功能

a.继承-方法重写,会造成子类非常臃肿,子类会越来越庞大

class  A{
    public void a(){}
    public void b(){}
    public void c(){}
    public void d(){}
    public void e(){}
}

class B extends A{
    public void a(){
    }
}

b.装饰设计模式

BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(...)))

项目地址:传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容