欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO|转换流和缓冲流详解

程序员文章站 2024-03-07 08:40:44
...

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

转换流

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

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

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();
        }
    }
}

运行结果:

IO|转换流和缓冲流详解

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();
        }
    }
}

运行结果:

IO|转换流和缓冲流详解

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();
        }
    }
}

运行结果:

IO|转换流和缓冲流详解

相关标签: IO Java java