首页 > java中字节流读写和字符流读写怎么理解?哪个效率更高

java中字节流读写和字符流读写怎么理解?哪个效率更高

我们java中的io流分为两大类,字节流和字符流。
可是在具体使用的时候怎么视情况进行使用?
怎么使用更加有效率?

有两个例子,帮忙看看解释一下,用哪种比较有效率以及适用情况。
下面是用字符流进行读写
写入

  FileOutputStream out = null;
        BufferedWriter writer = null;
        try {   
            out = openFileOutput("data", Context.MODE_PRIVATE); 
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    //关闭
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

读取

FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                   //关闭
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

下面使用字节流读写
写入

public void WriteFiles(String content){
         try {
            FileOutputStream fos = openFileOutput("a.txt", MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE);
             fos.write(content.getBytes());
             fos.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
    }

读取

public String readFiles(){
        String content = null;
         try {
            FileInputStream fis= openFileInput("a.txt");
            ByteArrayOutputStream baos =  new ByteArrayOutputStream();
            byte [] buffer =  new byte[1024];
            int len = 0;
            while ((len=fis.read(buffer))!=-1) {
                baos.write(buffer, 0, len);
            }
            content = baos.toString();
            fis.close();
            baos.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return content;
    }

对小文件读写,几乎无差异。
对大文件读写,Buffer比较好些。对于多次读写硬盘,好的缓存机制能快些。比方说60GB文件,你肯定分批(甚至分行),多次读写。
其次,你想处理字符,还是字节,根据需要选择。


两者的区别就是:字节流可以既可以操作文本文件,也可以操作非文本文件,如一些二进制数据(图片,视频,对象),而字符流只能操作文本。这也是两者的适用情况,如何决定该使用哪种数据流读写取决于要读写的数据类型,若是文本本件,当然选择字符流,因为我们都知道字符流每次处理的单元为2个字节的Unicode字符,而字节流每次处理的是一个,若是非文本文件,那么就只能用字节流了,这个时候就不能单纯的看谁的效率高了。我想这也是为什么要有两者数据流的原因吧。


所有的IO操作都是通过字节完成的,系统底层不存在字符这个概念,Java中 InputStream 和 OutputStream 中只有字节操作方法,没有字符串方法。所有的可以进行字符串读写的流封装对象,都是上层实现,方便使用而已。

具体选择那种流来使用,他们之间效率如何,都要看具体场景和功能实现的目的,没有单纯的好坏。

以你上面的两个例子,效果完全是一样的,只不过你选择使用 BufferedWriter 和 BufferedReader 的内部实现还是字节实现 Buffer 缓冲而已。

Java 是开源的,建议多看源码,熟悉内部原理和实现。

【热门文章】
【热门文章】