php截取字符串网站内容(一下IOUtils的底层实现原理及使用方法)

优采云 发布时间: 2022-02-12 19:20

  php截取字符串网站内容(一下IOUtils的底层实现原理及使用方法)

  一:使用BufferedReader

  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

   String s = IOUtils.toString(new FileInputStream(keyWordFile) , "UTF-8");

//去除空格和换行符

String keyWords = keyWordStr.replaceAll("\\s*", "").replaceAll("\\n","");

  就编码简洁性而言,上面两种方式肯定比第二种好很多,但实际上性能差不多,一种牺牲了读的性能,另一种牺牲了写的性能。

  两种结果的区别:使用BufferedReader是逐行读取,然后使用StringBuilder添加,所以没有换行,而IOUtils直接将整个文件的内容转成字符串,所以也收录换行.

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

  我们可以看到IOUtils也使用了字符流InputStreamReader,但是这个字符流的效率远不如BufferedReader。BufferedReader 是 Reader 的包装器。它可以读取一行并且效率更高。因此,使用了IOUtis的读取效率。更低。但是IOUtils在写的时候使用了StringBuilderWriter,比一个一个地追加StringBuilder效率更高。所以总结一下上面的总结:BudderReader读快写满,IOUtils读慢写快。

  可能有人会问,既然IOUtis读写慢就是为了快,那为什么不干脆让它读快一点,让它读写快一点呢?

  这个想法是正确的,但理想很美好,现实很无奈。因为 InputStreamReader 是一个专门的字符流,所以它被看作是字符流和字节流之间的桥梁。字节流可以用于任何类型的对象,包括二进制对象,而字符流只能处理字符或字符串。字节流提供了处理任何类型的 IO 操作的能力,但它不能直接处理 Unicode 字符,而字符流可以。两种流都有自己的长处和短处。因此,IOUtils 采用这种设计面向大众。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线