как настроить BufferedInputStream read ()? - PullRequest
0 голосов
/ 02 апреля 2010

Я читаю столбец BLOB из базы данных Oracle, затем записываю его в файл следующим образом:

    public static int execute(String filename, BLOB blob)
  {

    int success = 1;

    try
    {
      File              blobFile   = new File(filename);
      FileOutputStream  outStream  = new FileOutputStream(blobFile);
      BufferedInputStream inStream   = new BufferedInputStream(blob.getBinaryStream());

      int     length  = -1;
      int     size    = blob.getBufferSize();
      byte[]  buffer  = new byte[size];

      while ((length = inStream.read(buffer)) != -1)
      {
        outStream.write(buffer, 0, length);
        outStream.flush();
      }

      inStream.close();
      outStream.close();
    }
    catch (Exception e)
    {
      e.printStackTrace();
      System.out.println("ERROR(img_exportBlob) Unable to export:"+filename);
      success = 0;
    }
}

Размер файла составляет около 3 МБ, а чтение буфера занимает 40-50 с. Это на самом деле данные 3D-изображения. Итак, есть ли способ уменьшить это время?

1 Ответ

3 голосов
/ 02 апреля 2010

Учитывая, что BLOB-объект уже имеет концепцию буфера, возможно, что вы на самом деле наносите ущерб производительности, вообще используя BufferedInputStream - он может делать меньшие read() вызовы, больше сетевых вызовов, чем необходимо.

Попробуйте полностью избавиться от BufferedInputStream, просто читая непосредственно из двоичного потока двоичного объекта. Это всего лишь мысль, но стоит попробовать. О, и вам не нужно очищать выходной поток каждый раз, когда вы пишете.

(Кроме того, вы должны b закрывать потоки в блоках finally - в противном случае вы утечете дескрипторы, если что-нибудь вызовет исключение.)

...