缓冲流、转换流、序列化流

一、缓冲流

       1.概念:

         缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

      2.分类:      

  • 字节缓冲流BufferedInputStreamBufferedOutputStream

  • 字符缓冲流BufferedReaderBufferedWriter

       3.字节缓冲流   

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。

  • public BufferedOutputStream(OutputStream out): 创建一个新的缓冲输出流。

例:

public class BufferedDemo {
    public static void main(String[] args) throws FileNotFoundException {
        // 记录开始时间
          long start = System.currentTimeMillis();
        // 创建流对象
        try (
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe")); //创建字节缓冲输入流
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));//创建字节缓冲输出流
        ){
        // 读写数据
            int len;
            byte[] bytes =new byte[1*1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("缓冲流复制时间:"+(end - start)+" 毫秒");
    }
}

       4.  字符缓冲流

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。

  • public BufferedWriter(Writer out): 创建一个新的缓冲输出流。

特有的方法:     

  • BufferedReader:public String readLine(): 读一行文字。

  • BufferedWriter:public void newLine(): 写一行行分隔符,由系统属性定义符号。

  •  

例1:

public class BufferedReaderDemo {
    public static void main(String[] args) throws IOException {
           // 创建流对象
        BufferedReader br = new BufferedReader(new FileReader("in.txt"));
        // 定义字符串,保存读取的一行文字
        String line  = null;
          // 循环读取,读取到最后返回null
        while ((line = br.readLine())!=null) {
            System.out.print(line);
            System.out.println("------");
        }
        // 释放资源
        br.close();
    }
}

例2:

public static void writer1() {
    
    //文件字符输出流
    File str =new File("2.txt");
    BufferedWriter writer;
    try {
        writer =new BufferedWriter(new FileWriter(str));
        //操作
        //写法一
        /*String str1 ="I love you 蔡徐坤";
        char[] aa =str1.toCharArray();             //字符串->>字符数组
        writer.write(aa,0,aa.length);*/
        
        //写法二
        /*String str1 ="I love you 蔡徐坤";
        writer.write(str1,0,str1.length());*/
        
        //写法三
        writer.append("唱跳 Rop");
        writer.newLine(); //换行符
        writer.append("蔡徐坤");
        writer.flush();
    } catch (IOException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
    }
    
}

二、转换流

        1.字符编码和字符集

         编码:字符(能看懂的)--字节(看不懂的)

         解码:字节(看不懂的)-->字符(能看懂的)

         2.InputStreamReader类

    构造方法:

  • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。

  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。

InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");

      3.OutputStreamWriter类

     构造方法:      

  • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。

  • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");

转换流理解图解:

 

 

 

 

三、序列化流

       

     1.ObjectOutputStream

      构造方法:

  • public ObjectOutputStream(OutputStream out): 创建一个指定OutputStream的ObjectOutputStream。

FileOutputStream fileOut = new FileOutputStream("employee.txt");
ObjectOutputStream out = new ObjectOutputStream(fileOut);

       

  1. 一个对象要想序列化,必须满足两个条件:

  • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException

  • 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

2.ObjectInputStream类

       构造方法:

     public ObjectInputStream(InputStream in): 创建一个指定InputStream的ObjectInputStream。

FileInputStream fileIn = new FileInputStream("employee.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);

 

四、打印流

       1.PrintStream类

       构造方法:

        public PrintStream(String fileName): 使用指定的文件名创建一个新的打印流。

PrintStream ps = new PrintStream("ps.txt");

 

posted @ 2020-03-05 18:48  撑起一片阳光  阅读(220)  评论(0编辑  收藏  举报