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

五、常用流关系图

时间: 2024-10-12 03:59:22

Java IO之处理流(缓冲流、转换流)的相关文章

Java IO学习笔记(三)转换流、数据流、字节数组流

转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和BufferedWriter,并使用它们的readLine 和 newLine方法. 2.有两种转换流:InputStreamReader.OutputStreamWriter 练习小程序1: package test.io.transfer; import java.io.FileOutputSt

java基础54 IO流技术(转换流)

1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流    2.输出字节流的转换流:OutputStreamWriter是字符流通向字节流的桥梁(相对于数据来说的):可以把输出字节流转换为输出字符流 2.转换流的作用 1.如果目前获取的是一个字节流需要转换为字符流,这个时候就可以使用转换流. 字节流---->字符流       2.使用转换流可以指定编码进行读写文件 3.实例 1 package com.dhb.file;

1.java.io包中定义了多个流类型来实现输入和输出功能,

1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B.字节流和字符流 C.节点流和处理流   D.File stream E.Pipe stream F.Random stream G.Filter stream

黑马程序员--Java基础学习笔记【IO流-字节流、转换流】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- IO 流 常用基类 字节流 InputStreamOutputStream 常用方法 int read() // 读取一个字节,以 int 形式返回 intread(byte[] b) // 读取最多数组长度个字节并存入该数组,返回实际读取字节 void write(int d) // 写出一个字节 voidwrite(byte[] d) // 将给定字节数组中的所有字节全部写出 void w

IO流 流操作规律 转换流的由来

package com.yyq; import java.io.*; /* * 转换流--------指定码表 * 需求: 想将一个文件的数据打印在控制台上 * 源:文件 * 目的:控制台 * 流操作的基本规律: * 最痛苦的就是流的对象有很多,不知道该用哪一个 * * 三个明确来完成: (1)明确 源和目的 * 源: 输入流 (InputStream Reader) * 目的:输出流(OutputStream Writer) * (2)明确操作的数据是否是纯文本 * 是纯文本: 字符流 * 不

Java IO学习笔记(五)对象流

1.Object流:直接将Object写入或读出. 2.序列化:将Object直接转化成字节流写到硬盘或网络上. 3.如果想把一个对象转化成字节流,该对象的实体类必须得实现Serializable接口,Serializable接口是标记性接口,它并没有任何方法,只是用于标识该类可以被序列化. 4.transient关键字,用于修饰成员变量,表示该成员变量是透明的,与Serializable接口同用,表示序列化的时候不考虑该成员变量.序列化时存的是该成员变量数据类型的默认值. 5.External

Java IO学习笔记(四)打印流

1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStream操作不会抛出异常,数据没打印出来也不会抛异常. 2.System.out.print(Object object)调用的是Object实体类的toString()方法. 3.PrintWriter和PrintStream有自动的flush功能,不需要手动调用flush方法.*这里必须强调一点:P

Java 基础 IO流(转换流,缓冲)

一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢 二,转换流 2.1 OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指

IO流----转换流、缓冲流

打开一个文本文件,另存为: Ansi就是系统默认编码(就是gbk) 建一个编码是utf-8的txt文件, 例: import java.io.FileWriter; import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException { //确定目的地 FileWriter fw=new FileWriter("E:\\zyx\\java\\utf-

15、IO (转换流、缓冲流)

转换流概述 * A: 转换流概述 * a: 转换流概述 * OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节 * 将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去 ? 转换流_字符转字节的过程 * A: 转换流_字符转字节的过程 * a.图解 * 详见day24_source/转换流.JPG图片 ? OutputStreamWriter写文本文件 * A: OutputStreamWriter写文本文件 * a: