缓冲流、转换流、序列化流、装饰者模式、commons-io工具包——冲冲冲

缓冲流

概述

缓冲流也叫高效流,是对四个基本流的增强。原理:在创建流对象的时候,会自动创建一个内置的默认大小的缓冲区数组,通过缓冲区读写。减少IO次数,提高效率。

字节缓冲流

缓冲字节输入流(BufferedInputStream)

构造方法: public BufferedInputStream(InputStream in);//传入普通的字节流

缓冲字节输出流(BufferedOutputStream)

构造方法: public BufferedInputStream(OutputStream out);//传入普通的字节流

    public static void main(String[] args) throws IOException {
        //创建普通流
        FileOutputStream ff = new FileOutputStream("1.txt");
        FileInputStream ff2 = new FileInputStream("copy.txt");
        //创建缓冲流
        BufferedInputStream fos = new BufferedInputStream(ff2);
        BufferedOutputStream fis = new BufferedOutputStream(ff);
        //复制文件
        long start = System.currentTimeMillis();
        int b = 0;
        while (((b = fos.read()) != -1)) {
            fis.write(b);
        }
        long end = System.currentTimeMillis();
        fis.close();
        fos.close();
    }
}

缓冲字符输入流(BufferedReader)

构造方法: public BufferedReader(Reader r);//传入普通的字符流
特有方法:

public String readLine();//一次读取一行内容

缓冲字符输出流(BufferedWriter)

构造方法:public BufferedWriter(Writer w);//传入普通的字符流
特有方法:

public void newLine();//写一个换行符
    public static void main(String[] args) throws IOException {
        //缓冲字符输出流【写流】
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("1.txt"));
        for (int i = 0; i < 5; i++) {
            bufferedWriter.write("java");
            //写入一个换符
            bufferedWriter.newLine();
        }
        //释放资源
        bufferedWriter.close();
        //缓冲字符输入流【读流】
        BufferedReader bufferedReader = new BufferedReader(new FileReader("2.txt"));
        //读一行,如果读完,【输出null】
        //String s = bufferedReader.readLine();
        //System.out.println(s);
        //bufferedReader.close();
        //一次读取一行的循环代码
        String j = "";//用来保存读取的数据【读取、赋值、判断是否=null】
        while ((j = bufferedReader.readLine()) != null) {
            System.out.println(j);
        }
        //释放资源
        bufferedReader.close();
    }
}

注意:
一次读取一行的标准循环,不会因为有一行为“null"字符串或者有一行为空字符串内容而停止。
只有读取到文件的末尾,没有内容返回值null才能停止!!

案例:文本排序

读取文本中的内容,按照序号排序,排序后从头到尾写入新的文件中。

    public static void main(String[] args) throws IOException {
        //读取文件内容
        ArrayList<String> list = new ArrayList<>();
        BufferedReader bufferedReader = new BufferedReader(new FileReader("csb.txt"));
        String a = "";
        while (((a = bufferedReader.readLine()) != null)) {
            list.add(a);
        }
        bufferedReader.close();
        //对集合排序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //按照字符串的首字母排序
                return o1.charAt(0) - o2.charAt(0);
            }
        });
        //写入到新的文件
        BufferedWriter writer = new BufferedWriter(new FileWriter("new.txt"));
        for (String s : list) {
            writer.write(s);//一次写一行
            writer.newLine();//换行
        }
        writer.close();
    }
}

转换流

读文件时指定编码,写文件时指定编码。
编码和解码
按照某种规则,将字符存储存储到计算机中——编码(‘a’——>97)
把字节转换成字符——解码(97——>‘a’)

字符编码和字符集

字符集:一个系统支持的所有字符对的集合。

字符编码

字符编码:字符与二进制一一对应的一套规则。

字符集

常见的字符集和字符编码【重点】

ASCII字符集——ASCII编码,规定ASCII字符集中所有的字符都占1个字节。
GBK字符集——GBK编码,规定所有的中文字符,都占2个字节。
Unicode字符集——Utf—8编码,规定所有的中文字符都占3个字节。

ISO——8859-1字符集,是西欧国家的字符集。

编码引出的问题

Idea默认使用UTF—8编码,windows默认使用GBK编码。
解决方案:
1、把文件的编码改成UTF—8和idea一致。
2、把IDEA的编码改成GBK和文件的一致。

使用转换输入流InputStreamReader解决读取中文的问题

转换输入流 InputStreamReader extends Reader
构造方法:

public InputStreamReader(InputStream in ,String charsetName);//使用指定编码格式读文件
public InputStreamReader(InputStream in);//使用工具默认编码读文件

使用转换输出流OutputStreamWriter写不同编码的中文的问题

转换输出流 OutputStreamWriter extends Writer
构造方法:

public  OutputStreamWriter(OutputStream in ,String charsetName);//使用指定编码写文件
public  OutputStreamWriter(OutputStream in);//使用工具默认编码写文件

案例:转换文件编码

将GBK编码文本文件,转为utf-8编码的文本文件
分析:
1、先把GBK编码的文本文件用GBK编码读出来
2、再把数据写入到utf-8文件中

    public static void main(String[] args) throws IOException {
        //使用GBK编码读GBK文件
        InputStreamReader inputStreamReader1 = new InputStreamReader(new FileInputStream("gbk.txt"), "GBK");
        //用utf-8编码写文件
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("iop.txt"), "UTF-8");
        //写入
        int a = 0;
        while (((a = inputStreamReader1.read()) != -1)) {
            outputStreamWriter.write(a);
        }
        outputStreamWriter.close();
        inputStreamReader1.close();
    }
}

序列化流

序列化流:写对象的流

ObjectOutputStream的介绍和使用

构造方法:

public ObjectOutputStream(OutputStream  out);//需要接受一个普通字节输出流

想要序列化,必须实现java.io.Serializable接口,该接口中没有方法,一般称为标记接口。
反序列化流:读取对象的流

ObjectInputStream的介绍和使用

构造方法:

public ObjectInputStream(InputStream in);//需要接受一个普通字节输入流

关于序列化异常的问题

ClassNouFoundException:出现原因是因为,序列化之后,反序列化之前,删除了用来序列化的那个类。
InvalidClassException:序列化之后,反序列化之前,修改了用来序列化的那个类。
实际上序列化流判断类是否有效通过,SerialVersionUID来识别的。

如果需要序列化多个对象怎么操作?

序列化流,只适合序列化一个对象,但是我们可以把多个对象保存到一个集合中,序列化集合对象即可。

打印流

PrintStream流中重写了各种类型的方法。

PrintStream常用方法

构造方法:

public PrintStream(String path);
public PrintStream(File file);
public PrintStream(OutputStream out);

成员方法:

public void print();
public void println();

装饰者模式

概述

不同的设计模式解决不同的问题,装饰者模式则是在不改变原类,不使用继承的继承,对原类的功能的一个扩展。

装饰者模式4个步骤

1、装饰类和被装饰类(原类)必须实现一致的接口
2、在装饰类中必须传入被装饰类的引用
3、在装饰类中对需要扩展的方法进行扩展
4、在装饰者类中对不需要扩展的方法,调用与原类中同名的方法

commons-io工具包

概述

commons-io是简化IO操作的工具包

使用

将commons-io工具包中解压后的文件commons-io.jar复制到我们创建的lib文件夹下。

常用API介绍

commons-io.IOUtils中的方法:
1、copy();接受两个流,输入流与输出流———复制文件(2GB以下的文件)。
2、copyLarge();接受两个流,输入流与输出流———复制文件(2GB以上的文件)。
3、FileUtils.copyFileToDirectory();将某文件复制到文件夹里面。
4、FileUtils.copyDirectoryToDirectory();将某文件夹复制到某文件夹。

小结

java中的流相关的问题暂时解决啦。要开始web阶段啦!!!

发布了34 篇原创文章 · 获赞 9 · 访问量 1282

猜你喜欢

转载自blog.csdn.net/weixin_43616750/article/details/105035744
今日推荐