Java IO之处理流(缓冲流、转换流)

一、处理流:

增强功能,提供性能,在节点流之上。

二、节点流与处理流的关系

节点流(字节流、字符流)处于IO操作的第一线,所有操作必须通过它们进行;
处理流可以对其他流进行处理(提高效率或操作灵活性)。

三、缓冲流

1、字节缓冲流

BufferedInputStream
BufferedOutputStream
package IOBuffer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 处理流(字节缓冲流)
 * 字节流文件拷贝+缓冲流,提高性能
 * 缓冲流(节点流)
 */

@SuppressWarnings("all")
public class Demo01 {
    public static void main(String[] args) {
        String srcPath = "G:/1314.jpg";
        String destPath = "G:/try/520.jpg";
        try {
            copyFile(srcPath,destPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void copyFile(String srcPath,String destPath) throws IOException 
    {
        //1、建立联系  源存在(且为文件)+目的地(文件可以不存在)                
        File src = new File(srcPath);
        File dest = new File(destPath);
        if(!src.isFile())
        {
            System.out.println("只能拷贝文件");
            throw new IOException("只能拷贝文件");
        }

        //2、选择流 缓冲流(字节输入流)      
        InputStream is = new BufferedInputStream(new FileInputStream(src));
        OutputStream os =new BufferedOutputStream(new FileOutputStream(dest)) ;

        //3、文件拷贝  循环+读取+写出
        byte[] flush = new byte[1024];
        int len = 0;    
        while(-1!=(len = is.read(flush)))
        {
            //写出
            os.write(flush,0,len);
        }
        os.flush();//强制刷出           
        //关闭流 先打开后关闭
        os.close();
        is.close();
    }
}

2、字符缓冲流

BufferedReader  新增readLine()读取一个文本行。 
BufferedWriter  新增newLine()写入一个行分隔符。
package IOBuffer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 
 * 字符缓冲流+新增方法(不能发生多态)
 */

public class Demo02 {
    public static void main(String[] args) {
        String srcPath = "G:/oo.txt";
        String destPath = "G:/xx.txt";      
        //创建源
        File src = new File(srcPath);
        File dest = new File(destPath);

        //选择流   缓冲流   如果后面要使用新增方法,就不能使用多态了。
        //如果没有使用子类的新增方法,可以使用多态方式。
        /*Reader reader = null;
        Writer writer = null;
        reader =new BufferedReader(new FileReader(src)) ;
        writer = new BufferedWriter(new FileWriter(dest));
        reader.read(flush)
        writer.write(flush,0,len)*/     
        BufferedReader reader = null;
        BufferedWriter writer = null;

        try {
            reader =new BufferedReader(new FileReader(src)) ;
            writer = new BufferedWriter(new FileWriter(dest));
            //读取操作
            //新增方法操作的字符缓冲流
            String line = null;//一行一行读取 BufferedReader新增readLine()
            while(null!=(line = reader.readLine()))
            {
                writer.write(line);
                //writer.append("\r\n");//换行符
                writer.newLine();//换行符  新增方法
            }
            writer.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件不存在");
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally
        {
            if(null!=reader)
            {
                try {
                    writer.close();
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }       
    }
}

四、转换流

(一)字节流转换为字符流,处理乱码(编码集、解码集)
解码:二进制–>解码字符集–>字符
编码:字符–>编码字符集–>二进制

(二)为什么会出现乱码?
1、解码与编码的字符集不统一
2、字节缺少,长度丢失

(三)文件乱码(通过转换流进行处理)

package IOConver;

import java.io.UnsupportedEncodingException;

public class Demo01 {
    public static void main(String[] args) {

        test01();
        System.out.println("-----------");
        test02();
    }

    //解码与编码字符集字符集必须相同
    public static  void test01()
    {
        //解码byte-->char
        String str = "中国";//UTF-8
        //编码 char-->byte
        byte[] data = str.getBytes();
        //编码与解码的字符集统一
        System.out.println(new String(data));


        try {
            data  = str.getBytes("gbk");//设定编码字符集    编码
            //不统一字符集,出现乱码
            System.out.println(new String(data));//解码
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        byte[] data2;
        try {
            //编码
            data2 = "中国".getBytes("GBK");
            //解码
            str = new String(data2,"GBK");
            //str = new String(data2);//不指定 默认解码UTF-8 会出现乱码
            System.out.println(new String(str));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }               
    }
    //字节缺少,长度丢失
    public static  void test02(){
        String str = "中国";
        byte[] data;
        data = str.getBytes();//编码
        //字节数不完整
        System.out.println(new String(data,0,4));

    }
}

运行结果:

?й?
中国
-----------
中?
package IOConver;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 转换流:字节转为字符
 * 1、输出流OutputStreamWriter  编码
 * 2、输入流InputStreamReader  解码
 */
public class Demo02 {
    public static void main(String[] args) throws IOException {
        //输入文件  解码 (字节到字符)   读取  要显示  
        //指定解码字符集    BufferedReader字符流--InputStreamReader转换流--FileInputStream字节流
        BufferedReader br = new BufferedReader
                (
                    new InputStreamReader
                    (
                        new FileInputStream(new File("g:/writer.txt")),"UTF-8"
                    )
                );//指定字符解码集

        //写出文件     编码(字符到字节)
        BufferedWriter bw = new BufferedWriter
                (
                    new OutputStreamWriter
                    (
                        new FileOutputStream(new File("G:/try/abdec.txt")),"UTF-8"
                    )
                );

        String info = null;
        while(null!=(info = br.readLine()))
        {
            System.out.println(info);
            bw.write(info+"\r\n");
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

运行结果:

每个人都有青春,
每个青春都有一个故事,
每个故事都有一个遗憾,
每个遗憾却都存在着他的美好。ouye

五、常用流关系图

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。