gpt4 book ai didi

java - 包装 byte[] 的 ImageInputStreamImpl 实现

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:21 24 4
gpt4 key购买 nike

我正在尝试创建 ImageInputStream 的实现,它只是包装一个 byte[]。

这是我的实现,但对于某些图像 ImageIO 返回有关损坏数据的错误。

我找不到任何有用的替代方案,与 JDK 捆绑在一起的 ImageInputStreamImpl 的每个子类都会执行缓存并浪费内存。

public static class MyMemoryCacheImageInputStream extends ImageInputStreamImpl {

private SimpleByteArrayInputStream stream;

public MyMemoryCacheImageInputStream(SimpleByteArrayInputStream stream) {
if (stream == null) {
throw new IllegalArgumentException("stream == null!");
}
this.stream = stream;
}

@Override
public int read() throws IOException {
bitOffset = 0;
return stream.read();
}

@Override
public void seek(long pos) throws IOException {
super.seek(pos);
stream.seek(pos);
}

@Override
public int read(byte[] b, int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException("b == null!");
}
if (off < 0 || len < 0 || off + len > b.length || off + len < 0) {
throw new IndexOutOfBoundsException("off < 0 || len < 0 || off+len > b.length || off+len < 0!");
}

bitOffset = 0;

if (len == 0) {
return 0;
}

return stream.read(b, off, len);
}

@Override
public boolean isCached() {
return false;
}

@Override
public boolean isCachedFile() {
return false;
}

@Override
public boolean isCachedMemory() {
return false;
}

@Override
public void close() throws IOException {
super.close();
stream = null;
}
}

请注意,SimpleByteArrayInputStream 本质上是一个 ByteArrayInputStream,具有“seek”方法来修改内部流位置。

最佳答案

我也面临过类似的挑战,并创建了一个 implementation可以在 GitHub 上根据 BSD 许可证获得。它不包装 ByteArrayInputStream,而是直接使用 byte 数组。

我还没有测试你的实现,但我相信它的主要问题是它在读取时无法正确更新streamPos。当您调用 super.seek(pos) 时,查找似乎没问题。以下内容应该可以解决该问题:

@Override
public int read() throws IOException {
bitOffset = 0;

int val = stream.read();

if (val != -1) {
streamPos++;
}

return val;
}

@Override
public int read(byte[] b, int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException("b == null!");
}
if (off < 0 || len < 0 || off + len > b.length || off + len < 0) {
throw new IndexOutOfBoundsException("off < 0 || len < 0 || off+len > b.length || off+len < 0!");
}

bitOffset = 0;

if (len == 0) {
return 0;
}

int read = stream.read(b, off, len);

if (read > 0) {
streamPos += read;
}

return read;
}

我还相信,严格来说,isCached()isCachedMemory 应该为您的实现返回 true,如果它确实由 byte 数组支持。但我认为这并不重要(即,我从未见过实际使用这些方法来优化任何内容的代码)。

关于java - 包装 byte[] 的 ImageInputStreamImpl 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53597325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com