Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Запаковать кучку файлов / 9 сообщений из 9, страница 1 из 1
23.03.2016, 13:06
    #39198734
JDS
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
23.03.2016, 13:16
    #39198751
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запаковать кучку файлов
JDS,

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

Поэтому предварительная сортировка выглядит наиболее разумным вариантом.
...
Рейтинг: 0 / 0
23.03.2016, 13:37
    #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
23.03.2016, 13:54
    #39198788
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запаковать кучку файлов
BlazkowiczДля того чтобы добавить файл в ZIP, его нужно перепаковать. Вот пример.
Поэтому предварительная сортировка выглядит наиболее разумным вариантом.
Да. На такой же пример и привел ссылку.
mayton, Blazkowicz, значит буду сначала сортировать. Спасибо.
...
Рейтинг: 0 / 0
23.03.2016, 14:00
    #39198791
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запаковать кучку файлов
Ну там... по линии else я забыл инициализировать zos.
...
Рейтинг: 0 / 0
23.03.2016, 14:14
    #39198804
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запаковать кучку файлов
maytonНу там... по линии else я забыл инициализировать zos.
Прикольно, но думаю, что не потянет так - под гиг данных сотни тыщ файлов за сотню другую дней.
Попробу совсем тупо: взял файл, посмотрел его дату, пошел по директории собирать в архив файлы с этой же датой и т.д. (сортировать лень )). Осталось только найти как окргулять дату до дня )
...
Рейтинг: 0 / 0
23.03.2016, 14:16
    #39198807
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запаковать кучку файлов
а. ну SimpleDateFormat-ом и буду )
...
Рейтинг: 0 / 0
23.03.2016, 16:02
    #39198897
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запаковать кучку файлов
JDS,

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


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