powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Запаковать кучку файлов
9 сообщений из 9, страница 1 из 1
Запаковать кучку файлов
    #39198734
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть папка с порядка 300тыс. мелких текстовиков...
Надо все эти файлы рассовать по архивам по дням создания (порядка трех тысяч файлов в день, т.е. три тыщи файлов в каждый архив).
Делаю так (сурово, но как могу :)):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
package zipfiles;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.DirectoryIteratorException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFiles {

    private static final String sourceDir = "D:\\test\\";
    private static final String targetDir = "D:\\test_archive\\";
    
    private static void zipFile(String fileName) throws FileNotFoundException, IOException {
        File fl = new File(sourceDir + fileName);

        Date fileDate = new Date(fl.lastModified());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String zipFileName = dateFormat.format(fileDate) + ".zip";
        
        ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(targetDir + zipFileName));
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(sourceDir + fileName);
            ZipEntry entry = new ZipEntry(fileName);
            zout.putNextEntry(entry);

            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            // вроде как добавляем содержимое к архиву
            zout.write(buffer);
            fl.delete();            
        } catch(Exception ex) {             
            System.out.println(ex.getMessage());
        } finally {
            zout.closeEntry();
            fis.close();
        }
    }

    public static void main(String[] args) throws Exception {
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourceDir))) {
            for (Path file: stream) 
               if(!file.toFile().isDirectory() && file.getFileName().toString().endsWith(".xml"))                   
                  zipFile(file.getFileName().toString());
        } catch (IOException | DirectoryIteratorException x) {
                System.err.println(x);
        }        
    }
}


Т.е.:
1. читаем директорию
2. смотрим дату создания файла и пытаемся засунуть его в соответствующий архив
пробую через ZipEntry.putNextEntry
Но при этом он затирает уже существующие в нем файлы (ну или пересоздает архив).

Нашел такой вариант добавления
Но здесь похоже:
1. из архива создается копия
2. создается новый архив, куда кладутся файлы из п.1 + новый файл
Но это ж громоздко и долго. Есть ли другие варианты?

Сам вижу такой вариант:
1. Прочитать все файлы в директории, отсортировать их по дате
2. По порядку заливать их в соответствующий архив сразу подбирая все файлы для нужного архива

Но может есть вариант гуманного добавления файла в zip?
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198751
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

У вас FileOutputStream тупо создаёт новый файл. С чего вы решили что таким образом можно добавлять в ZIP файлы не понято.
Для того чтобы добавить файл в ZIP, его нужно перепаковать. Вот пример.
http://stackoverflow.com/a/2265206

Поэтому предварительная сортировка выглядит наиболее разумным вариантом.
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198765
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делал подобное. Если уникальных дней не очень много можно сделать так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
public class ZipFiles {

    private static final String sourceDir = "D:\\test\\";
    private static final String targetDir = "D:\\test_archive\\";
    private static Map<String,ZipOutputStream> zosMap = null;

    private static void zipFile(String fileName) throws FileNotFoundException, IOException {
        File fl = new File(sourceDir + fileName);

        Date fileDate = new Date(fl.lastModified());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String zipFileName = dateFormat.format(fileDate) + ".zip";
        String dateFormatString = dateFormat.format(fileDate);

        ZipOutputStream zout = null;
        //ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(targetDir + zipFileName));
        if (zosMap.containsKey(dateFormatString)){
            zout = zosMap.get(dateFormatString);
        } else {
            zosMap.put(dateFormatString,new ZipOutputStream(new FileOutputStream(targetDir + zipFileName)));
        }
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(sourceDir + fileName);
            ZipEntry entry = new ZipEntry(fileName);
            zout.putNextEntry(entry);

            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            // вроде как добавляем содержимое к архиву
            zout.write(buffer);
            fl.delete();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            // zout.closeEntry();
            fis.close();
        }
    }

    public static void main(String[] args) throws Exception {
        zosMap = new HashMap<>();
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourceDir))) {
            for (Path file : stream)
                if (!file.toFile().isDirectory() && file.getFileName().toString().endsWith(".xml"))
                    zipFile(file.getFileName().toString());
            for(Map.Entry<String,ZipOutputStream> zentry : zosMap.entrySet()){
                zentry.getValue().close();
            }
        } catch (IOException | DirectoryIteratorException x) {
            System.err.println(x);
        }
    }
}



Если много - то ХЗ. Надо посчитать насколько ресурсоёмкие экземпляры ZipOutputStream
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198788
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДля того чтобы добавить файл в ZIP, его нужно перепаковать. Вот пример.
Поэтому предварительная сортировка выглядит наиболее разумным вариантом.
Да. На такой же пример и привел ссылку.
mayton, Blazkowicz, значит буду сначала сортировать. Спасибо.
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198791
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну там... по линии else я забыл инициализировать zos.
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198804
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу там... по линии else я забыл инициализировать zos.
Прикольно, но думаю, что не потянет так - под гиг данных сотни тыщ файлов за сотню другую дней.
Попробу совсем тупо: взял файл, посмотрел его дату, пошел по директории собирать в архив файлы с этой же датой и т.д. (сортировать лень )). Осталось только найти как окргулять дату до дня )
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198807
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а. ну SimpleDateFormat-ом и буду )
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198897
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

А обязатльно на Java? CMD c Forfiles , например не подойдёт?
...
Рейтинг: 0 / 0
Запаковать кучку файлов
    #39198984
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSmaytonНу там... по линии else я забыл инициализировать zos.
Прикольно, но думаю, что не потянет так - под гиг данных сотни тыщ файлов за сотню другую дней.
Попробу совсем тупо: взял файл, посмотрел его дату, пошел по директории собирать в архив файлы с этой же датой и т.д. (сортировать лень )). Осталось только найти как окргулять дату до дня )
Сотня дней - фигня делов. Потянет. Делай. Сотня OutputStream-ов не равна суммарному
объёму файлов. Стрим это стрим. А файл это файл. Не одно и тоже.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Запаковать кучку файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]