我想将一个以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.codec
的 Base64InputStream
替换了 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/