我使用servlet和Apache ServletFileUpload为上传的图像提供流。我想要做的就是将该映像存储到db,并将resized(我使用JAI)版本存储到db。
如何在不将图像保存到驱动器的情况下实现此目的。据我所知,流只能读一次。所以我需要将整个图像存储在内存中?性能昂贵吗?还是有另一种方式?
答案 0 :(得分:1)
据我所知,可以读取流 只有一次。
是
所以我需要存储整个图像 存储器?
可能,但不一定。查看setBinaryStream的PreparedStatement方法。在某些情况下,您可能只是将输入流传递给该方法。查看其他一些流方法,您的JDBC驱动程序可能只支持其中的一部分。
通过一些聪明的缓冲,您可以在一次调用中提供原始流和调整大小的图像。
性能是否昂贵?
你在谈论什么表现。如果记忆力有限,这当然很重要。否则,内存I / O是最不可能成为瓶颈的地方。
如果你有足够的内存,我会建议你采取这种方法,因为实现是最直接的,内存便宜。
还是有另一种方式?
正如我之前所说,你可以创建一个聪明的缓冲技术,但这需要大量的测试(和设计)。如果内存有限,您可能必须恢复此方法,否则,只需读取整个流,处理它并将结果写入数据库。
答案 1 :(得分:0)
这是从输入流中获取字节数组的方法。如果流太大,你应该关注内存不足。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
public class SO2805548
{
public static byte[] getStreamData(InputStream is) throws IOException
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
int i = -1;
while ((i = is.read()) != -1)
{
os.write(i);
}
return os.toByteArray();
}
public static void main(String[] args) throws IOException
{
byte[] input = "foobar".getBytes("UTF-8");
ByteArrayInputStream inputStream = new ByteArrayInputStream(input);
byte[] data = getStreamData(inputStream);
System.out.println("arrays are equal = " + Arrays.equals(input, data));
}
}