java IO知识点

1.对于字节流InputStream和OutPutStream,当read()和writer()时,他们只接受byte[]型数组。

对于字符流Reader和Writer,read()接受char[]类型,writer()可以接受字符串、char[]数组,int值等参数。


为什么已经存在字节流还要引入字符流

熟悉java的应该知道,字节流比字符流产生的更早,可以说jdk一面世,已经有字节流了。那么为什么后面又引入了字符流呢? 
首先,各个单位之间的关系,我们要清楚: 
字节我们用Byte做单位,位我们用bit做单位,这就是大小b的关系 
1字节(B) = 8位(b) 
1字符 = 2字节(B) = 16位(b)

然后国际化的Unicode编码是16位的,也就是占2个字节,或者1个字符。那么我们简单的用字节流来处理Unicode编码,就显得非常鸡肋,所以字符流也就应运而生了。同时,使用字符流操作会比字节流操作更加的迅速,为什么会更加迅速呢?一个最显然的加速方式就是缓存区字符流是用了缓存区的,而字节流是直接与文件进行操作当我们关闭字符流的时候会自动将缓存区中的内容写入文件,若不关字符流则不会写入文件。或者我们刷新缓存区也可以。以下是一个典型的试验,用两者方式输出一个文件,但是都不关闭流,如果存在缓存区的话,那么它的触发机制就是流关闭导致它的缓存结束:

package com.brickworkers.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;

public class FileReadTest {

    public static void main(String[] args) throws IOException {
        File file1 = new File("F:/java/io/write1.txt");
        //字节流输出
        OutputStream os = new FileOutputStream(file1);
        String txt = "helloworld";
        try{
            os.write(txt.getBytes());
        }finally{
            //不关闭流
        }

        File file2 = new File("F:/java/io/write2.txt");
        Writer writer = new FileWriter(file2);
        try{
            writer.write(txt);
        }finally{
            //不关闭流
        }

    }

}

运行结果你会发现:使用字节流的在文本文件中已经写入了hello world,但是字符流却没有写入,说明字符流是带有缓存区的,这个时候就需要刷新缓存区,或者关闭流来触发输出。不要在输入流用不关闭流来进行上述测试,试想一下不管存不存在缓存区,你数据读取了,那么就都会是有了的,并不会收缓存区影响。

当然,并不是说摒弃字节流全部都使用字符流,在很多情况下字符流是不能用的,什么情况呢?指定字节操作的时候就不可以用字符流。前面说过,所有的资源都是以字节的形式存储的,包括图片,视频,音频等等,所以在日常的开发中字节流的操作还是非常普及的。

两个流派进行转化

一个面向字符流,一个面向字节流。那么他们之间在JDK中是如何转化的呢?Reader与Writer中有两个类来处理这种转化,他们分别是InputStreamReaderOutputStreamWriter,可以称这两个为适配器类

package com.brickworkers.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class FileReadTest {

    public static void main(String[] args) throws IOException {
        File file = new File("F:/java/io/write.txt");
        //字节流输出
        OutputStream os = new FileOutputStream(file);
        String txt = "hello world";

        //把字节流转化成字符流操作
        Writer writer = new OutputStreamWriter(os);
        try {
            writer.write(txt);
        } finally{
            writer.close();
        }

    }

}
上面的代码字节流转化成字符流

猜你喜欢

转载自blog.csdn.net/oyeyuanxinzhizhu1/article/details/80197084