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、解码与MT4登录真实账户教程编码的字符集不统一

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

————————————————

原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/45932481

猜你喜欢

转载自www.cnblogs.com/benming/p/11791665.html