BufferedInputStream和BufferedReader文本读取

JAVA的文本读取主要有字节流读取和字符流读取两种方式,字节流可以既可以操作文本文件,也可以操作非文本文件,如一些二进制数据(图片,视频,对象),而字符流只能操作文本。

研究了下这两种读取文本的方式,主要用BufferedInputStream和BufferedReader,简单做了个总结,如下:

public class IOtest {
    public static void main(String[] args) {
        String path = "src/io_test.txt";

        Date d1 = new Date();
        String result1 = BrTest(path);//字符流读取
        Date d2 = new Date();
        System.out.println("==========>>>br cost:"+(d2.getTime()-d1.getTime())+"ms");
//      System.out.println(result1);

        d1 = new Date();
        String result2 = IsTest(path);//字节流读取
        d2 = new Date();
        System.out.println("==========>>>is cost:"+(d2.getTime()-d1.getTime())+"ms");
//      System.out.println(result2);

    }

    /**
     * 
    * @Title: IsTest
    * @Desc: 字节流
    *
    *  @param path
    *  @return 参数
    *
     */
    public static String IsTest(String path) {
        InputStream is = null;
        StringBuilder sb = new StringBuilder();//切忌不要直接用String直接拼接文本。。效率太低,每次要new新对象,用StringBuilder,StringBuffer都可以
        try {
//          is = new FileInputStream(path);
            //这里用Buffered 缓存,效率有所提升
            is = new BufferedInputStream(new FileInputStream(path));
            byte[] buf = new byte[1024];

            sb = new StringBuilder();
            int len = is.read(buf);
            while (len != -1) {
                sb.append(new String(buf,0,len));//这里需要注意:不能直接new String(buf),循环到文本最后的时候,如果只剩下100个字节,buf(上面1024字节)没有写满,buf只会替换前面100个字节,后面924个字节还是之前的。所以在最后一次循环的时候要有个范围才行。
                len = is.read(buf);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {//记着在finally中关闭IO
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

    /**
     * 
    * @Title: BrTest
    * @Desc: 字符流
    *
    *  @param path
    *  @return 参数
    *
     */
    public static String BrTest(String path) {
        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();//同样,字符串操作多就不要用String了
        try {
            br = new BufferedReader(new FileReader(path));

            //readline这是网上最常见的读取方式,然而我经过实测,发现效率并不是很高,但也没太大影响
//          String str = null;  
//          while ((str = br.readLine()) != null) {
//              sb.append(str+"\n");
//          }
            //这里使用CharBuffer的话比直接readline快很多
            CharBuffer cb = CharBuffer.allocate(1024);
            while(br.read(cb)!=-1){
                cb.flip();//注意,这里不调会死循环。。。flip()将缓存字节数组的指针设置为数组的开始序列即数组下标0。这样就可以从buffer开头,对该buffer进行读取。 
                sb.append(cb.toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {//关掉IO
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在安卓开发中,`BufferedInputStream`和`BufferedReader`都是用于处理输入流的工具,但它们在设计和功能上有一些区别。 **BufferedInputStream** `BufferedInputStream`是一个提供缓冲输入流的类,它允许你一次性读取多个字节的数据。这个类主要用于提高读取效率,因为它会将数据缓存在内部,只有在缓冲区满或者调用`read()`方法时才会从底层输入流中读取数据。这大大减少了直接从底层输入流中读取数据的次数,提高了效率。 主要方法包括: * `read(byte[] b)`: 从输入流中读取数据到byte数组中。 * `read()`: 返回下一个字节的数据,如果缓冲区有数据则直接返回,否则从底层输入流中读取。 * `skip(long n)`: 跳过n个字节的数据。 * `mark(int readAheadLimit)`: 设置一个标记,标记当前位置以及之后n个字节的数据。 * `reset()`: 恢复到标记的位置。 **BufferedReader** `BufferedReader`是一个用于读取字符流的类,它提供了更高级别的输入操作,如读取一行、一个单词或者单个字符。它也提供了缓冲机制,但是其缓冲的数据是字符而不是字节。它通常用于处理文本文件或网络通信。 主要方法包括: * `readLine()`: 读取一行文本并返回字符串。 * `read()`: 返回下一个字符,直到遇到换行符或EOF。 * `mark(int readAheadLimit)`: 设置一个标记,标记当前位置以及之后指定长度的文本内容。 * `reset()`: 恢复到标记的位置,但如果标记之后的数据被其他操作改变(例如输出操作),那么可能无法恢复到原来的位置。 **区别**: * **数据类型**: `BufferedInputStream`处理的是字节流,而`BufferedReader`处理的是字符流。 * **效率**: 由于`BufferedReader`需要处理的是字符流,所以它的效率可能不如`BufferedInputStream`高,特别是当处理大量数据时。但是,对于小块数据的读取或者文本文件,它的优势会更加明显。 * **功能**: `BufferedReader`提供了更高级别的输入操作,如读取一行、一个单词或者单个字符,这对于处理文本文件或者类似的任务非常有用。 * **缓冲**: 两者都提供了缓冲机制以提高效率,但`BufferedReader`的缓冲是针对字符的,而`BufferedInputStream`的缓冲是针对字节的。 因此,在选择使用哪一个类时,需要根据具体的应用场景和需求来决定。对于大量、频繁的数据读取,可以使用`BufferedInputStream`以提高效率;而对于小块、高频次的文本输入操作,可以使用`BufferedReader`提供更高级别的输入操作和更好的可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值