前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何将文件内容转成String字符串

如何将文件内容转成String字符串

作者头像
Java深度编程
发布2020-06-10 09:16:37
3.3K0
发布2020-06-10 09:16:37
举报
文章被收录于专栏:Java深度编程Java深度编程
一: 使用BufferedReader
代码语言:javascript
复制
try {
    //spring,springBoot环境下可以使用此方式,也可以直接new File(path)
      File keyWordFile = ResourceUtils.getFile("classpath:keyWord.txt");
      BufferedReader reader = new BufferedReader(new FileReader(keyWordFile));
      //使用StringBuilder更快,但不安全,因为此处只有读,所以不影响
      StringBuilder buffer = new StringBuilder();
      String keyWord = null;
      while ((keyWord = reader.readLine()) != null) {
          buffer.append(keyWord);
      }
      //去除字符串中的空格
      String keyWords = buffer.toString().replaceAll("\\s*", "");
  } catch (FileNotFoundException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
 }

方式二:使用IOUtils

代码语言:javascript
复制
    String s = IOUtils.toString(new FileInputStream(keyWordFile) , "UTF-8");
  //去除空格和换行符
    String keyWords = keyWordStr.replaceAll("\\s*", "").replaceAll("\\n","");

以上两种方式从编码简洁度来讲,肯定是第二种好很多,但其实性能是差不多的,一个是牺牲了读的性能,另一个是牺牲了写的性能。

两种结果的区别:使用BufferedReader是一行一行的读取,随后使用StringBuilder添加,所以是没有换行符的,而IOUtils是直接将整个文件的内容转成了字符串,所以也包括了换行符。

我们来看一下IOUtils的底层实现原理:

代码语言:javascript
复制
 public static String toString(InputStream input, Charset encoding) throws IOException {
        StringBuilderWriter sw = new StringBuilderWriter();
        copy((InputStream)input, (Writer)sw, (Charset)encoding);
        return sw.toString();
  }
  
  public static void copy(InputStream input, Writer output, Charset inputEncoding) throws IOException {
        InputStreamReader in = new InputStreamReader(input, Charsets.toCharset(inputEncoding));
        copy((Reader)in, (Writer)output);
  }

  public static int copy(Reader input, Writer output) throws IOException {
       long count = copyLarge(input, output);
       return count > 2147483647L ? -1 : (int)count;
  }

 public static long copyLarge(Reader input, Writer output) throws IOException {
      return copyLarge(input, output, new char[4096]);
 }

 public static long copyLarge(Reader input, Writer output, char[] buffer) throws IOException {
        long count;
        int n;
        for(count = 0L; -1 != (n = input.read(buffer)); count += (long)n) {
            output.write(buffer, 0, n);
        }
        return count;
    }

我们可以看到其实IOUtils使用的也是字符流InputStreamReader,但此字符流远没有BufferedReader的效率高,BufferedReader是对Reader的一层包装,它能够读取一行,效率更高,因此使用IOUtis的读取效率要低些。然而IOUtils在写的时候使用了StringBuilderWriter,这个写的效率更高些,比使用StringBuilder一个个append要高许多。因此综上所述总结:BudderReader读取更快,写满,IOUtils读取慢,写更快。

有人可能会提出疑问,既然IOUtis读慢写快,为何不直接也让它读取更快呢,这样不就读写都快了吗?

这个想法是没错的,只是理想很美好,现实很无奈。因为InputStreamReader是专门的字符流,它视为字符流与字节流之间的桥梁。字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串。 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以,两种流各有长短。因此IOUtils为了大众能够通用所以采取了这种设计。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java深度编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一: 使用BufferedReader
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档