Java: разбивка огромного файла на более мелкие сжатые файлы [dубликат]

Я не думаю, что есть способ сделать это, но вы можете установить свои измерения на мм / см / дюймы или другие и основывать свое форматирование вокруг этого.

Вы можете добавить вертикальную линейку включив его: настройки: -> tools -> options -> LibreOffice Writer -> View -> Вертикальная линейка

12
задан 25 October 2012 в 16:00

2 ответа

Если цель состоит в том, чтобы выход был совместим с pkzip и winzip, я не знаю о каких-либо библиотеках с открытым исходным кодом, которые это делают. У нас было аналогичное требование для одного из наших приложений, и я закончил писать свою собственную реализацию (совместимую со стандартом zip). Если я помню, самое сложное для нас было то, что нам приходилось генерировать отдельные файлы «на лету» (так, как работают большинство zip-утилит, они создают большой zip-файл, а затем возвращаются и разбивают его позже), это намного проще

Стандарт zip объясняет, как выглядит формат файла. Если вы не боитесь немного свернуть свои рукава, это определенно выполнимо. Вам нужно самому реализовать генератор zip-файлов, но вы можете использовать класс Deflator Java для генерации потоков сегментов для сжатых данных. Вам придется сами создавать заголовки файлов и разделов, но они просто байты - не слишком тяжело, когда вы погружаетесь.

Вот спецификация zip - раздел K содержит информацию, которую вы ищете специально, но вам также нужно прочитать A, B, C и F. Если вы имеют дело с действительно большими файлами (мы были), вам также придется попасть в материал Zip64, но для 24 МБ вы в порядке.

I f вы хотите погрузиться и попробовать - если вы столкнетесь с вопросами, отправьте сообщение назад, и я увижу, могу ли я предоставить некоторые указатели.

5
ответ дан 15 August 2018 в 14:42
  • 1
    У меня проблемы с многотомными zip-файлами. В частности, когда один файловый компонент разделяется между файлом диска. В file.zx01 у меня есть заголовок файла и первая часть сжатых данных, а затем в файле.zx02 У меня есть остальные сжатые данные. Но по какой-то причине я не могу собрать файлы, и я не уверен, почему. У вас есть опыт здесь? – vy32 26 August 2010 в 02:09

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

private final static long MAX_FILE_SIZE = 1000 * 1000 * 1024; //  around 1GB 
private final static String zipCopyDest =  "C:\\zip2split\\copy";

public static void splitZip(String zipFileName, String zippedPath, String coreId) throws IOException{

    System.out.println("process whole zip file..");
    FileInputStream fis  = new FileInputStream(zippedPath);
    ZipInputStream zipInputStream = new ZipInputStream(fis);
    ZipEntry entry = null;
    int currentChunkIndex = 0;
    //using just to get the uncompressed size of the zipentries
    long entrySize = 0;
    ZipFile zipFile = new ZipFile(zippedPath);
    Enumeration enumeration = zipFile.entries();

    String copDest = zipCopyDest + "\\" + coreId + "_" + currentChunkIndex +".zip";

    FileOutputStream fos = new FileOutputStream(new File(copDest));
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    ZipOutputStream zos = new ZipOutputStream(bos);
    long currentSize = 0; 

    try {
        while ((entry = zipInputStream.getNextEntry()) != null && enumeration.hasMoreElements()) {

            ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
            System.out.println(zipEntry.getName());
            System.out.println(zipEntry.getSize());
            entrySize = zipEntry.getSize();

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            //long entrySize = entry.getCompressedSize();
            //entrySize = entry.getSize(); //gives -1

            if((currentSize + entrySize) > MAX_FILE_SIZE) {
                zos.close();
                //construct a new stream
                //zos = new ZipOutputStream(new FileOutputStream(new File(zippedPath, constructCurrentPartName(coreId))));
                currentChunkIndex++;
                zos = getOutputStream(currentChunkIndex, coreId);
                currentSize = 0;

            }else{
                currentSize += entrySize;
                zos.putNextEntry(new ZipEntry(entry.getName()));
                byte[] buffer = new byte[8192];
                int length = 0;
                while ((length = zipInputStream.read(buffer)) > 0) {
                    outputStream.write(buffer, 0, length);
                }

                byte[] unzippedFile = outputStream.toByteArray();
                zos.write(unzippedFile);
                unzippedFile = null;
                outputStream.close();
                zos.closeEntry();
            }
            //zos.close();
        }
    } finally {
        zos.close();
    }


}

 public static ZipOutputStream getOutputStream(int i, String coreId) throws IOException {
     System.out.println("inside of getOutputStream()..");
     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipCopyDest + "\\" + coreId + "_" +  i +".zip"));   
    // out.setLevel(Deflater.DEFAULT_COMPRESSION);
     return out;
 }

public static void main(String args[]) throws IOException{
    String zipFileName = "Large_files _for_testing.zip";
    String zippedPath= "C:\\zip2split\\Large_files _for_testing.zip";
    String coreId = "Large_files _for_testing";
    splitZip(zipFileName, zippedPath, coreId);
}
0
ответ дан 15 August 2018 в 14:42

Другие вопросы по тегам:

Похожие вопросы: