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

Откуда:
Сообщений: 24
Есть хранимая жава - процедура, которая должна архивировать указанные ей файлы. Все работает отлично, но только при архивировании текстовых файлов, внутри которых есть русский текст, получается фигня - вместо русских букв сплошные крокозяблы. Кто знает как это исправить?
Процедура такая:
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class ZipCompress {
  public static void main(String[] args) 
  throws IOException {
    FileOutputStream f = new FileOutputStream("/u02/samba/pub/utl_file/test.zip");
    CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(csum));
    out.setComment("Java Zipping");
    for(int i = 0; i < args.length; i++) {
      BufferedReader in = new BufferedReader(new FileReader("/u02/samba/pub/utl_file/"+args[i]));
      out.putNextEntry(new ZipEntry(args[i]));
      int c;
      while((c = in.read()) != -1)
        out.write(c);
      in.close();
    }
    out.close();
  }
}
25 авг 04, 19:48    [908452]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Попробуй так:

import java.io.*;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipCompress {
  public static void main(String[] args)
    throws IOException {

    FileOutputStream f = new FileOutputStream("/u02/samba/pub/utl_file/test.zip");
    CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(csum));
    out.setComment("Java Zipping");
    for (int i = 0; i < args.length; i++) {
      InputStream in = null;
      try {
        in = new DataInputStream(new BufferedInputStream(new FileInputStream("/u02/samba/pub/utl_file/" + args[i])));
        out.putNextEntry(new ZipEntry(args[i]));
        byte[] b = new byte[500];
        int iCount = -1;
        do {
          iCount = in.read(b);
          if (iCount != -1) {
            out.write(b, 0, iCount);
          }
        } while (iCount != -1);
      } catch (EOFException e) {
      } finally {
        if (in != null) {
          in.close();
        }
      }
      out.close();
    }
  }
}
25 авг 04, 20:14    [908479]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
interested
Member

Откуда:
Сообщений: 24
Громадное спасибо!
Помогло.
25 авг 04, 20:23    [908491]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
serjb
Member

Откуда: Астана->СПб
Сообщений: 254
у меня тоже проблема:
никак не получается задать внутри архива русские имена файлов включаемых в архив

на клиенте winrar 3.0
на сервере HP-UX 11i + Oracle9i (9.2.0.5)
26 авг 04, 08:15    [908750]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Возьми не "родной" ZipOutputStream, а от Ant Можешь и не качать, если пользуешься какой-нибудь средой разработки - во многих из них Ant уже есть - но можно взять и отдельно. Там есть такой архив ant.jar, он потребуется для работы. У меня прокатило следующее:

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

import java.io.*;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;

public class ZipCompress {
  public static void main(String[] args)
    throws IOException {
    FileOutputStream f = new FileOutputStream("C:/Tmp/test.zip");
    CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(csum));
    // Это DOS-кодировка.
    out.setEncoding("ibm-866");
    File file = new File("C:/Tmp/солярис.txt");
    InputStream in = null;
    try {
      in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
      out.putNextEntry(new ZipEntry(file.getName()));
      byte[] b = new byte[500];
      int iCount = -1;
      do {
        iCount = in.read(b);
        if (iCount != -1) {
          out.write(b, 0, iCount);
        }
      } while (iCount != -1);
    } catch (EOFException e) {
    } finally {
      in.close();
    }
    out.close();
  }
}

По-моему это уже в Jаva надо переносить, а м.б. и в FAQ.
26 авг 04, 12:56    [909941]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
serjb
Member

Откуда: Астана->СПб
Сообщений: 254
to Denis Popov
спасибо, ещё вопрос
в твоих примерах буфер для чтения 500 байт - почему "не ровная" цифра?
27 авг 04, 06:37    [912682]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Ну поставь 512:) ИМХО как-то без разницы, можно конечно поэкспериментировать с размером буфера - если в основном встречаются большие файлы, то можно его увеличить. Можно просто написать:

byte[] b = new byte[(int)file.length()];

если размер всех файлов укладывается в диапазон значений типа int. Тогда будет всего один проход.
27 авг 04, 12:17    [913665]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Хранимая JAVA-процедура  [new]
Vento
Member

Откуда:
Сообщений: 23
Denis Popov
Попробуй так:

import java.io.*;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipCompress {
  public static void main(String[] args)
    throws IOException {

    FileOutputStream f = new FileOutputStream("/u02/samba/pub/utl_file/test.zip");
    CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(csum));
    out.setComment("Java Zipping");
    for (int i = 0; i < args.length; i++) {
      InputStream in = null;
      try {
        in = new DataInputStream(new BufferedInputStream(new FileInputStream("/u02/samba/pub/utl_file/" + args[i])));
        out.putNextEntry(new ZipEntry(args[i]));
        byte[] b = new byte[500];
        int iCount = -1;
        do {
          iCount = in.read(b);
          if (iCount != -1) {
            out.write(b, 0, iCount);
          }
        } while (iCount != -1);
      } catch (EOFException e) {
      } finally {
        if (in != null) {
          in.close();
        }
      }
      out.close();
    }
  }
}


Денис или многоуважаемый ALL, у меня тоже русский текст упаковывается как попало. Не могли бы Вы прокоментировать, что собственно решает проблему (или дать ссылку где почитать)? Я пытаюсь использовать такой код:
import oracle.sql.BLOB;
import oracle.sql.CLOB;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
...
    public static BLOB compressclob(CLOB clob, String fn) throws Exception {

      Connection con = DriverManager.getConnection("jdbc:default:connection:");
      BLOB result = BLOB.createTemporary(con, true, BLOB.DURATION_SESSION);

      ZipOutputStream out = new ZipOutputStream(result.getBinaryOutputStream());
      InputStream in = null;

      try {
        in = new DataInputStream(clob.getAsciiStream());
        out.setLevel(9);
        out.putNextEntry(new ZipEntry(fn));
    
        byte[] buffer = new byte[clob.getChunkSize()];
        int cnt = -1;

        do {
          cnt = in.read(buffer);
          if (cnt != -1) {
            out.write(buffer, 0, cnt);
          }
        } while (cnt != -1);

      }
      catch (EOFException e) {}
      finally {if (in != null) {in.close();}
      }

      out.close();
      return result;
    }

Например строка "Тестовая строка" упакованная моим кодом, после распаковки winrar-ом представляется как ""5AB>20O AB@>:0".

Прошу помощи. Заранее спасибо!
12 июл 06, 15:49    [2872050]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая JAVA-процедура  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
А выше глянуть? Еще: https://www.sql.ru/forum/actualthread.aspx?bid=38&tid=303484

Только это добро надо загрузить в Oracle. Можно грузить не весь ant.jar, а только требуемые классы, список уже составлялся. Все остальное можно удалить из архива перед загрузкой.
12 июл 06, 16:10    [2872259]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить