Как я могу использовать один поток и сохранить результат во многих местах? - PullRequest
1 голос
/ 10 мая 2010

Я использую сервлет и Apache ServletFileUpload, который предоставляет поток для загруженного изображения. Все, что я хочу сделать, это сохранить это изображение в БД, а также сохранить измененную версию (я использую JAI) версию в БД.

Как мне добиться этого без сохранения образа на диск. Как я понимаю поток может быть прочитан только один раз. Так мне нужно хранить целое изображение в памяти? Это дорого для производительности? Или есть другой способ?

Ответы [ 2 ]

1 голос
/ 10 мая 2010

Как я понимаю поток можно прочитать только один раз.

Да

Так что мне нужно хранить все изображение в память

Возможно, но не обязательно. Посмотрите на setBinaryStream метод PreparedStatement . При некоторых условиях вы могли бы просто передать свой поток ввода этому методу. Посмотрите на какой-нибудь другой потоковый метод, ваш драйвер JDBC может поддерживать только их подмножество.

С некоторой умной буферизацией вы можете, вероятно, обслуживать исходный поток и измененное изображение также за один вызов.

Это дорого по производительности?

О каком спектакле вы говорите. Если память ограничена, это, конечно, будет иметь значение. В противном случае память ввода-вывода является наименее вероятным местом, чтобы стать узким местом.

Если у вас достаточно памяти, я бы порекомендовал вам воспользоваться этим подходом, поскольку реализация наиболее проста и память дешева.

Или есть другой способ?

Как я уже говорил, вы можете создать умную технику буферизации, но это требует большого тестирования (и проектирования). Если память ограничена, вам, возможно, придется вернуться к этому подходу, в противном случае просто прочитайте весь поток, обработайте его и запишите результат в БД.

0 голосов
/ 10 мая 2010

Так вы можете получить байтовый массив из входного потока. Вы должны быть обеспокоены нехваткой памяти, если поток слишком велик.

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));
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...