java - 在这种情况下,使用 BufferedReader 是否可以获得任何性能提升?

标签 java

我想将一个以base64编码的CSV文件从客户端发送到服务器,以便解析它并使用数据。 我想直接从 Request 对象获取 InputStream 并将其通过管道传递给 CSV 解析器使用的读取器。

  • 使用此方法是否会提高性能或内存?
  • 下面的代码可以实现这个目的吗?我感觉解码内容时缺少一些东西。
  • 此示例中真的需要 BufferedReader 吗?

    /* Suppose I get a Base64 encoded CSV file from the client */
    String csvContent = "Column 1;Column 2;Column 3\r\nValue 1;Value 2;Value 3\r\n";
    ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.encodeBase64(csvContent.getBytes()));
    
    /* retrieving the content UPDATED */
    Base64InputStream b64InputStream = new Base64InputStream(inputStream, false);
    
    /* Parsing the CSV content */
    Reader reader = new BufferedReader(
                        new InputStreamReader(b64InputStream));
    
    CSVParser csvParser = new CSVParser(reader, FORMAT_EXCEL_FR);           
    
    /* printing results */
    csvParser.forEach(record -> printRecord(record));
    

更新 我用来自 org.apache.commons.codecBase64InputStream 替换了 byte[] 数组

最佳答案

可能不是。 BufferedReader ...使用缓冲区。当您的数据尚未在 java 内存中时,通常会使用它。 (例如套接字通信、从文件读取数据……)

在您的例子中,您正在包装一个byte[],这意味着数据已经在内存中。所以添加缓冲区是没有意义的。

javadoc 对 BufferedReader 的描述如下:

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

现在,假设您想要读取文件的内容,并且想要逐字节检查某些内容。因此,您执行了大量 byte b = in.read(); 调用。在这种情况下,缓冲读取器实际上会在内部以 block 的形式获取这些字节。

因此,基本上,只要以 block 的形式获取数据更有效,就使用 BufferedReader

更新

响应您的更新。不,在这种情况下也没有必要添加 BufferedReader。正如霍尔格指出的:

It's likely that the CSVParser does that already (i.e. buffering).

我检查了 CSVParser 的源代码,并查看了构造函数中的内容。

public CSVParser(final Reader reader, final CSVFormat format, final long characterOffset, final long recordNumber)
        throws IOException {
    ...
    this.lexer = new Lexer(format, new ExtendedBufferedReader(reader));
    ...
}

它默认包装某种缓冲读取器。因此,无需自己添加。

关于java - 在这种情况下,使用 BufferedReader 是否可以获得任何性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524914/

相关文章:

java - Android 未知 logcat 消息 V/StudioTransport : Handling agent command 1200 for pid

java - Spring 保存语言环境并在用户登录时更改语言环境

java - 什么是NullPointerException,我该如何解决?

java - 使用paintComponent在JFrame中镜像对象

java - Maven如何根据平台配置更改依赖版本(MySQL)

java - CORS 支持 Jax-rs 2 AsyncResponse?

java - 如何在 MongoDB 的 application.properties 中设置等待队列倍数和最大池大小

java - 欧氏除法中的位补运算符

Java:将 ArrayList 项与用户输入字符串进行比较

java - 在服务器上运行Java应用程序