如何使用一个流并将结果保存到很多地方?

时间:2010-05-10 18:52:41

标签: java stream database

我使用servlet和Apache ServletFileUpload为上传的图像提供流。我想要做的就是将该映像存储到db,并将resized(我使用JAI)版本存储到db。

如何在不将图像保存到驱动器的情况下实现此目的。据我所知,流只能读一次。所以我需要将整个图像存储在内存中?性能昂贵吗?还是有另一种方式?

2 个答案:

答案 0 :(得分:1)

  

据我所知,可以读取流   只有一次。

  

所以我需要存储整个图像   存储器?

可能,但不一定。查看setBinaryStreamPreparedStatement方法。在某些情况下,您可能只是将输入流传递给该方法。查看其他一些流方法,您的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));
  }

}