java - 我们如何使用 hooking 来提高性能?

标签 java bufferedreader filereader

Java 文档说 Java Docs

public class BufferedReader extends Reader

Reads text from a character-input stream, buffering characters so as to provide for the >efficient reading of characters, arrays, and lines.

The buffer size may be specified, or the default size may be used. The default is large >enough for most purposes.

In general, each read request made of a Reader causes a corresponding read request to be >made of the underlying character or byte stream. It is therefore advisable to wrap a >BufferedReader around any Reader whose read() operations may be costly, such as >FileReaders and InputStreamReaders. For example,

BufferedReader in = new BufferedReader(new FileReader("foo.in"));

will buffer the input from the specified file. Without buffering, each invocation of >read() or readLine() could cause bytes to be read from the file, converted into >characters, and then returned, which can be very inefficient.

但是通过hook Filereader,我们使用FileReader的read方法来读取一次读取一个字符的文件,所以如果我的文件包含2000个字符,FileReader首先会一次读取2000个字符并将其传输到缓冲区,我们将读取使用 bufferedreader 从缓冲区读取,那么它如何提高性能。我们可以仅使用 FileReader 来做到这一点吗?

最佳答案

你可以这样想象:

您位于位置 A,您的数据位于位置 B,其中 AB 相距 5 公里彼此之间。

通过一次检索一个单位的数据,您必须从 AB(对底层字符或字节流发出读取请求)每次,因此如果您有 100 个数据单元,您将进行 100 次旅行,这需要花费时间。

缓冲就像拥有一辆卡车,当您旅行时,您将一些数据单元(缓冲区的大小)加载到装载地板(缓冲区)上,这样您就不必进行旅行很多次,从而提高效率。

通常,当您打开文件进行读取时,您希望读取多个字符,因此首选 BufferedRead。

这同样适用于写作。

编辑

首先,FileReader 不会读取自身,而是由底层输入流读取。在本例中FileInputStream

BufferedReader 为您管理 FileReasder,并在其 fill() 方法中使用该方法

abstract public int read(char cbuf[], int off, int len) throws IOException;

您的Reader来填充缓冲区。 它不使用只读取单个字符的方法! 换句话说,当 fill 方法必须执行旅行时,它会从底层检索一系列字符输入流并将其保存在内存中,以便当您需要读取时,它首先查找缓冲区,消耗它并在必要时重新填充它。

您可以通过自己调用 FileReaderread(char cbuf[], int off, int len) 来实现相同的目的,但您所拥有的只是一个范围例如具有以下文本的字符

Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua.

例如可能看起来像这样

"onsetetur sadipscing elitr,\r\nsed diam nonumy eirmod temp"

如果你需要的话,你将不得不处理它来找到一行文本。

但你不必这样做,因为 BufferedReader 会为你处理这个问题,这也是你最好编写的原因之一

BufferedReader in = new BufferedReader(new FileReader("foo.in"));

关于java - 我们如何使用 hooking 来提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22225529/

相关文章:

c - 以二进制形式读取 mid 文件以进行进一步分析

java - 如何防止 View 重叠?

java - Java代码输入小数时编译报错

java - 从 EJB 调用的事务中的过程在 JBoss AS 7.1 中获取 ARJUNA016051 : thread is already associated with a transaction!

java - 使用 readline() 和 split()

java - 使用 FileReader 时出现 NumberFormatException

java - 按下按钮时读取一行

android - 如何在 Android 上使用 phonegap/cordova 下载和保存文件

html - 内网IE兼容模式和Filereader的问题

java - 如何使用 Spring Boot 2.1 Webflux 定制 Netty?