php截取字符串网站内容(一下IOUtils的底层实现原理及使用方法)
优采云 发布时间: 2022-02-12 19:20php截取字符串网站内容(一下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 采用这种设计面向大众。