Java - сохранение данных в BLOB-файл - PullRequest
1 голос
/ 19 августа 2010

Я хочу сохранить множество двоичных файлов данных (PDF, изображения, офисные документы ...) в один файл «blob». теперь я не уверен, что лучше, сохранять вещи с помощью Java Serializable и сохранять вещи на диск или использовать базу данных, такую ​​как sqlite, чтобы все произошло. или есть третий, может быть, лучший способ? Мой вопрос заключается в том, насколько хорошо эти методы работают с точки зрения скорости доступа и целостности данных. в этом единственном двоичном файле будет однажды, может быть, сотни PDF-файлов. какой путь вы бы предпочли?

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Предполагая, что вы хотите создать один большой файл (а не какую-то запись в базе данных), вы можете использовать пакет java.util.zip для создания ZIP-файла из этих PDF-файлов, предпочтительно без сжатия (поскольку он быстрее и PDF-файлы).обычно плохо сжимаются).

Делая это, вы можете легко использовать сторонние инструменты для извлечения этих PDF-файлов из вашего "файла BLOB-объекта", то есть zip-архива.

2 голосов
/ 19 августа 2010

Определенно не используйте java.io.Serializable. Просто запишите двоичные данные как есть для своей цели. Сериализация только добавит ненужные издержки и сделает сохраненные данные непригодными для других инструментов, кроме Java.

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

Теперь код Java, API JDBC предлагает PreparedStatement#setBinaryStream() для сохранения двоичных данных в виде InputStream в базе данных. Существует также метод setBytes() для случая, когда он используется (перегрузка памяти) byte[]. Затем, чтобы получить его, вы можете просто использовать ResultSet#getBinaryStream() или getBytes().

С другой стороны, вы также можете просто сохранить эти файлы в файловой системе локального диска обычным способом ввода-вывода Java, используя FileOutputStream, и прочитать их, используя FileInputStream. При необходимости вы можете хранить пути / имена файлов в базе данных. Это отделяет двоичные данные от базы данных, что делает их менее переносимыми, но более пригодными для повторного использования для других целей.

Смотри также

0 голосов
/ 21 августа 2012

Этот метод для получения вашего двоичного файла или его байтов из вашей базы данных

static void BackfileToDecktop(String s) {
   File outFile=new File("URL");//example (C:\\Users\\osama\\Desktop)

   search(4);//search the file in data base to fetch it
   try{
      FileOutputStream fos=new FileOutputStream(outFile);

      byte[]l=columnByte;//column of bytes come by search method get it from database by its primary key
      for(int i=0;i<l.length;i++) {
          fos.write(l[i]);
      }

      if(fos!=null) { 
          fos.close();//write all file bytes 
      }

      JOptionPane.showMessageDialog(null,"File was fetched successfully","Untitled pane",JOptionPane.INFORMATION_MESSAGE);
 } catch(java.io.IOException e){
      System.err.println(e);
 }

}

...