Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 java+oracle  [new]
rrronnn
Member

Откуда:
Сообщений: 5
Добрый день!
Уже весь мозг сломал, прошу помощи.
Сразу оговорюсь, с java общаюсь первый раз, по этому можно меня немного попинать.

Задача:
1.Архивировать файлы, находящиеся в заданной директории на сервере.
2.Архивировать файлы, имена которых переданны в массиве.
С первой я справился, все работает (код ниже), а вот со второй возникли проблемы!

Проблема в следующем:
Есть строчка

String[] source = path.list();
, которая заполняет массив source именами файлов из директории path
Как же запихать в этот source данные из FileList???
Разобрался как в FileList положить что либо:

Connection conn = new OracleDriver().defaultConnection();
     ArrayDescriptor desc = ArrayDescriptor.createDescriptor("GC.T_VARCHAR2_2000_TABLE", conn);

     FileList[0] = new ARRAY(desc, conn, source);

, а вот как извлечь, не понятно.

java код:
create or replace and compile java source named "ZipUtils" as
import java.io.*;
import java.sql.*;
import oracle.sql.*;
import java.math.*;
import oracle.jdbc.driver.*;
import java.util.zip.*;
import java.util.*;
import java.lang.SecurityException;

public class ZipUtils {
  public static void zip(String zipFileName
                        ,String DirName
                        ,oracle.sql.ARRAY[] FileList
                        ) throws java.sql.SQLException, IOException 
  {
    ZipOutputStream zipOut = null;
    InputStream in = null;
         
    File path = new File(DirName);
    
    String[] source = path.list();
    
    try {
      zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
      //
      for (int i = 0; i < source.length; i++) { 
        File file = new File(DirName+"/"+source[i]);
        in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
        
        zipOut.putNextEntry(new ZipEntry(file.getName()));
        //копирует содержимое файла в архив
        byte[] b = new byte[(int) file.length()];
        int iCount;
        while ((iCount = in.read(b)) != -1) {
          zipOut.write(b, 0, iCount);
        }
        //
      }
    } finally {
      if (in != null) {in.close();}
      if (zipOut != null) {zipOut.close();}
    }
  }
}


Процедура вызова:

create or replace package JAVA_P is
--Процедура архивирует все, что находится в pDirName, либо то, что передано в pFileList. 
--создается pZipFileName.ZIP в каталоге pDirName   
  PROCEDURE ZIP_FILE(pZipFileName in VARCHAR2,
                     pDirName in VARCHAR2,
                     pFileList in out T_VARCHAR2_2000_TABLE  
                     );
--  
end JAVA_P;
/
create or replace package body JAVA_P is
  PROCEDURE ZIP_FILE(pZipFileName in VARCHAR2,
                     pDirName in VARCHAR2,
                     pFileList in out T_VARCHAR2_2000_TABLE
                     ) 
AS 
  language java name 'ZipUtils.zip(java.lang.String, java.lang.String, oracle.sql.ARRAY[])';
--
end JAVA_P;
/


Тип:
create or replace type T_VARCHAR2_2000_TABLE is table of varchar2(2000)


и анонимный блок:
declare
 a T_VARCHAR2_2000_TABLE:=T_VARCHAR2_2000_TABLE();
begin
  a.extend;
  a(1):='scott.txt';
  a.extend;
  a(2):='scott2.sql';
  gc.java_p.Zip_File('/u/rom/TEMP/arc.zip', '/u/rom/TEMP',a);
end;
/
13 май 14, 11:06    [16008902]     Ответить | Цитировать Сообщить модератору
 Re: java+oracle  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10762
rrronnn
Задача:
1.Архивировать файлы, находящиеся в заданной директории на сервере.
2.Архивировать файлы, имена которых переданны в массиве.
С первой я справился, все работает (код ниже), а вот со второй возникли проблемы!

Проблема в следующем:
Есть строчка
String[] source = path.list();
, которая заполняет массив source именами файлов из директории path
Согласно документации на java.io.File, listFiles() возвращает непосредственно File[], что намного удобнее строк в вашей задаче.
Разобрался как в FileList положить что либо:
FileList[0] = new ARRAY(desc, conn, source);
Забавный синтаксис слева от знака равенства ...
String[] FileList = new ARRAY(desc, conn, source)
"Как-то так" (ц) Винни-Пух.

P.S. Я привёл ссылку на актуальную документацию (Java7), версия java, поставляемая с СУБД может сильно отставать - в десятке, как помнится, 1.4.2, в 11G - 1.5.
Так что в своих изысканиях используйте документацию правильной версии. Или, хотя бы, ориентируйтесь на указание "Since x.y" javadoc-а.
13 май 14, 11:43    [16009130]     Ответить | Цитировать Сообщить модератору
 Re: java+oracle  [new]
rrronnn
Member

Откуда:
Сообщений: 5
Basil A. Sidorov,

Помогла статья http://docs.oracle.com/javase/7/docs/api/java/io/File.html

String[] source = (String[])FileList.getArray();

Но и вам тоже спасибо за помощь!!!
13 май 14, 12:16    [16009350]     Ответить | Цитировать Сообщить модератору
 Re: java+oracle  [new]
rrronnn
Member

Откуда:
Сообщений: 5
упс, не та ссылка
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3696816290928
13 май 14, 12:18    [16009363]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить