- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JPA AttributeConverter
,用于将 String
转换为 gzipped byte[]
并返回。
转换方法相当简单:
public byte[] convertToDatabaseColumn(String attribute) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(baos)) {
gos.write(attribute.getBytes(StandardCharsets.UTF_8));
gos.finish();
gos.flush();
return baos.toByteArray();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
我的问题是关于转换方法:
public String convertToEntityAttribute(byte[] dbData) {
try (GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(dbData));
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = gis.read(buffer)) > 0) {
baos.write(buffer, 0, len);
}
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
鉴于字节数组dbData
已经在内存中,那么缓冲区
中还有什么点吗?直接逐字节读入 baos
完全跳过 buffer
不是更“性能”吗?
如果读取方法正在进行底层操作系统调用,则缓冲区是有意义的,但它不在这里......
最佳答案
Given that the byte array dbData is already in memory, is there any point in the buffer?
缓冲区用于提高性能。与一次读取一个字节相比,它们通常确实可以提高性能,这是这里唯一的选择。
Is it not more "performant" to read byte-by-byte straight into the baos skipping the buffer altogether?
您的 baos 中的字节已被压缩,如果您可以读取这些字节,则您不会使用 GZIPInputStream。
<小时/>如果您想要效率和简单性,我建议您直接从 ByteArrayInput/OutputStream 读取/写入,而不使用 byte[]。
public byte[] convertToDatabaseColumn(String text) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(
new GZIPOutputStream(baos), StandardCharsets.UTF_8))) {
out.write(text);
out.close();
return baos.toByteArray();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public String convertToEntityAttribute(byte[] dbData) {
try (Reader reader = new InputStreamReader(
new GZIPInputStream(new ByteArrayInputStream(dbData)),
StandardCharsets.UTF_8) {
char[] chars = new char[512];
StringBuilder sb = new StringBuilder();
for (int len; (len = reader.read(chars)) > 0;)
sb.append(chars, 0, len);
return sb.toString();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
为了简化这一点,假设您的字符串不包含换行符,您可以这样做
public static byte[] convertToDatabaseColumn(String text) throws IOException {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(
new GZIPOutputStream(baos), StandardCharsets.UTF_8)) {
out.write(text);
out.write("\n");
out.close();
return baos.toByteArray();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public static String convertToEntityAttribute(byte[] dbData) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new GZIPInputStream(new ByteArrayInputStream(dbData)),
StandardCharsets.UTF_8))) {
return br.readLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public static void main(String[] args) throws IOException {
byte[] bytes = convertToDatabaseColumn("Hello world, 0123456789 0123456789");
System.out.println(convertToEntityAttribute(bytes));
}
关于java - 我需要 ByteArrayInputStream 的读取缓冲区吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873978/
关于 ByteArrayInputStream 的文档说: java.io.ByteArrayInputStream.ByteArrayInputStream(byte[] buf) Creates
我想知道是否是 ByteArrayInputStream java.io 包中的类好用吗?或者,如果要通过使用字节数组将其与自己的类进行比较,例如: private int pos = 0; priv
使用 ByteArrayInputStream 和/或 ByteArrayOutputStream 的一些实际领域是什么?也欢迎提供示例。 如果搜索示例,通常会找到如下内容: byte[] buf =
我正在研究流媒体网络摄像头。 现在我可以进行 1:1 TCP 网络摄像头通信。 问题是即使 gc 运行,堆内存也不会减少。 我尝试了重置(),刷新(),关闭()。 一切看起来都很好,但 new Byt
我有方法返回将显示为文本字符串的值。所以我正在做的是转换为 ByteArrayInputStream。 public String method() { inputStream = new B
假设一个函数如下: InputStream func() { byte[] buffer = new byte[] {0,1,2,3}; return
我只是想弄清楚 ByteArrayInputStream 中的字节类型。在一种情况下,我存储一个byte[],在另一种情况下,我存储一个Hashmap。以下代码仅在 byte[] 的情况下在 Obje
java.io 类太多了,对于其中一些我真的不明白什么时候需要它们,例如: 字节数组输入流、字节数组输出流 序列输入流, PushbackInputStream、PushbackReader 字符串读
基本上我使用(在groovy中)以下结构: InputStream in = new ByteArrayInputStream("one two three four".getBytes()); 但是
我将使用 Jsch ssh 到另一台服务器 并检查路径是否存在 但是我发现baos.toString() 将在终端上打印出所有结果: test -d /root/bin/python || echo
我正在使用一个 ByteArrayInputStream,它包含一个 XML 文档,该文档由一个元素组成,元素的内容是一个大的 base 64 编码字符串。我需要删除周围的标签,以便解码文本并将其输出
首先,在下面的代码中,我试图做的是使用“byteBuffer[0].length”找到二维字节数组的长度,但它实际上不起作用。当我打印 'byteBuffer[0].length' 时,它给出的输出为
我正在尝试通过 telnet 与 Windows 服务器中的应用程序进行交互,因此我使用的是 TelnetClient() 方法。我可以使用 System.in.read() 进行交互(发送命令和检索
我有一个 JPA AttributeConverter,用于将 String 转换为 gzipped byte[] 并返回。 转换方法相当简单: public byte[] convertToData
我正在尝试以 blob 数据格式 ([B@e96bf) 加载 MySQL 数据库中的图像,但无法将其加载到 JLabel,如下所示。它显示 ByteArrayInputStream 为空。 byte[
我想从 ByteArrayInputStream 获取内部字节数组。我不想扩展该类或将其写入另一个字节数组。有实用程序类可以帮助我做到这一点吗? 谢谢, 最佳答案 您无法访问相同的字节数组,但您可以轻
我在测试中遇到了这段代码。 byte[] bytes = new byte[] { -1, 1, 0x0 }; InputStream in = new ByteArrayInputStream(by
以下是在处理文件之前将整个文件读入内存的三种方法: 方法一: fis = new FileInputStream(file); bis = new BufferedInputStream(fis);
我有一个 ByteArrayInputStream 形式的图像。我想把它做成我可以保存到我的文件系统中某个位置的东西。 我一直在兜圈子,你能不能帮帮我。 最佳答案 如果您已经在使用 Apache co
我读过 this post但我不关注。我看过this但还没有看到使用 ByteArrayOutputStream 将 ByteArrayInputStream 转换为 String 的正确示例。 要将
我是一名优秀的程序员,十分优秀!