-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
116 lines (71 loc) · 3.7 KB
/
Solution.java
File metadata and controls
116 lines (71 loc) · 3.7 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//When he has come, he will convict the world about sin, about righteousness, and about judgment; (John 16:8)
package com.javarush.task.task31.task3105;
import java.io.*;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/*
Добавление файла в архив
*/
public class Solution {
public static void main(String[] args) throws IOException {
String fileName = args[0];
String zip = args[1];
String newFileName = "new" + File.separator + Paths.get(fileName).getFileName().toString();
Map<ZipEntry, ByteArrayOutputStream> map = new HashMap<>();
try (ZipInputStream zipReader = new ZipInputStream(new FileInputStream(zip))) {
ZipEntry zipEntry;
while ((zipEntry = zipReader.getNextEntry()) != null) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
while ((count = zipReader.read(buffer)) != -1)
byteArrayOutputStream.write(buffer, 0, count);
map.put(zipEntry, byteArrayOutputStream);
}
}
FileOutputStream fos = new FileOutputStream(zip);
ZipOutputStream zos = new ZipOutputStream(fos);
for(Map.Entry<ZipEntry, ByteArrayOutputStream> entry: map.entrySet()){
if(!Paths.get(entry.getKey().getName()).equals(Paths.get(newFileName))){
zos.putNextEntry(new ZipEntry(entry.getKey().getName()));
zos.write(entry.getValue().toByteArray());
}
}
zos.putNextEntry(new ZipEntry(newFileName));
File file = new File(fileName);
Files.copy(file.toPath(), zos);
zos.close();
fos.close();
}
}
/*
Добавление файла в архив
В метод main приходит список аргументов.
Первый аргумент - полный путь к файлу fileName.
Второй аргумент - путь к zip-архиву.
Добавить файл (fileName) внутрь архива в директорию 'new'.
Если в архиве есть файл с таким именем, то заменить его.
Пример входных данных:
C:/result.mp3
C:/pathToTest/test.zip
Файлы внутри test.zip:
a.txt
b.txt
После запуска Solution.main архив test.zip должен иметь такое содержимое:
new/result.mp3
a.txt
b.txt
Подсказка: нужно сначала куда-то сохранить содержимое всех энтри, а потом записать в архив все энтри вместе с добавленным файлом.
Пользоваться файловой системой нельзя.
Требования:
1. В методе main создай ZipInputStream для архивного файла (второй аргумент main). Нужно вычитать из него все содержимое.
2. В методе main создай ZipOutputStream для архивного файла (второй аргумент main).
3. В ZipOutputStream нужно записать содержимое файла, который приходит первым аргументом в main.
4. В ZipOutputStream нужно записать все остальное содержимое, которое было вычитано из ZipInputStream.
5. Потоки для работы с архивом должны быть закрыты.
*/