IO|转换流和缓冲流详解

本文深入解析转换流(如OutputStreamWriter和InputStreamReader)如何实现字节流与字符流之间的转换,以及缓冲流(如BufferedWriter和BufferedReader)如何通过内部缓冲区提升IO操作效率。文章提供了具体的代码示例,展示这些流的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转换流和缓冲流都是处理流,也称高级流,他们的使用都是要和节点流进行配合的。

转换流

作用:将字节流和字符流进行相互的转换

操作字符对人来说还是比操作字节要更加简单一些,所以出现了转换流。

OutputStreamWriter

将字节输出流变为字符输出流

class OutputStreamWriter extends Writer

从类的定义我们可以看出输出转换流继承了Writer类,和节点流的构造函数传递路径不同,他的构造函数都用到了OutputStream参数,将其实例化成一个Writer的实例。

public OutputStreamWriter(OutputStream out) {
    super(out);

    try {
        this.se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
    } catch (UnsupportedEncodingException var3) {
        throw new Error(var3);
    }
}

相对于字符流而言多了一个编码的属性

private final StreamEncoder se;

使用实例:

public class TestApp {
    public static void main(String[] args) {
        String path = "C:/Users/Chuuuki/Desktop/test.txt";
        try {
            FileOutputStream ops = new FileOutputStream(path);
            OutputStreamWriter opsw = new OutputStreamWriter(ops);

            opsw.write("Hello Chuki!");

            opsw.close();
            ops.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

InputStreamReader

将字节输入流变为字符输入流

和OutputStreamWriter基本是类似的

public class InputStreamReader extends Reader {
    private final StreamDecoder sd;

    public InputStreamReader(InputStream in) {
        super(in);

        try {
            this.sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
        } catch (UnsupportedEncodingException var3) {
            throw new Error(var3);
        }
    }

其中的方法基本也是基类Reader、Writer提供的方法。使用起来和基类实例类似,不过是实例化时传入的参数不同。

public int read() throws IOException {
    return this.sd.read();
}

缓冲流

为了提高IO流的读写速度。分为字节缓冲流:BufferedInputStream、BufferedOutputStream

字符缓冲流:BufferedReader、BufferedWriter

BufferedWriter

缓冲流在源码中都有一个char cb[]的缓冲区,在缓冲区写满之后再往磁盘上进行输出,将数据批量处理,可以提高效率。

不同的构造函数可以 设缓存的大小。

public class BufferedWriter extends Writer

也是继承了Writer父类,可以使用其提供的方法。当然他自己也由一些新的方法:void newLine()

public class TestApp {
    public static void main(String[] args) {
        String path = "C:/Users/Chuuuki/Desktop/test.txt";
        try {
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path));

            bufferedWriter.write("Hello");
            bufferedWriter.newLine(); // 根据当前的系统写入一个换行符 “\n”
            bufferedWriter.write("The second line...");

            bufferedWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

BufferedReader

继承了Reader父类,也有缓冲数组,除了能使用Reader的基本操作之外还向我们提供了一个新的方法

public String readLine()

读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回

public class TestApp {
    public static void main(String[] args) {
        String path = "C:/Users/Chuuuki/Desktop/test.txt";
        try {
            BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
            String msg = null;
            while ((msg = bufferedReader.readLine()) != null) {
                System.out.println(msg);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值