Создание файлов из ByteArrayOutputStream
Я пытаюсь создать отдельные файлы из ByteArrayOutputStream (здесь byteOut - это мой ByteOutputStream). Следующий код выполняет свою работу
final InputStream targetStream = new ByteArrayInputStream(byteOut.toByteArray());
final File destDir = new File(System.getProperty("user.dir"));
final byte[] buffer = new byte[1024];
ZipInputStream zis = new ZipInputStream(targetStream);
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File newFile = new File(destDir, zipEntry.getName());
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
zipEntry = zis.getNextEntry();
}
Но я хочу оптимизировать код, я пробовал использовать IOUtils.copy вот так
final InputStream targetStream = new ByteArrayInputStream(byteOut.toByteArray());
final File destDir = new File(System.getProperty("user.dir"));
ZipInputStream zis = new ZipInputStream(targetStream);
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File newFile = new File(destDir, zipEntry.getName());
try(InputStream is = new FileInputStream(newFile);
OutputStream fos = new FileOutputStream(newFile)) {
IOUtils.copy(is, fos);
}
zipEntry = zis.getNextEntry();
}
Но содержимое файла не копируется, и я также получаю исключение FileNotFoundException во второй итерации. Что я делаю не так?
1 ответ
Это вариант использования более общих классов Path & Files. С файловой системой zip это становится копированием высокого уровня.
Map<String, String> env = new HashMap<>();
//env.put("create", "true");
URI uri = new URI("jar:file:/foo/bar.zip");
FileSystem zipfs = FileSystems.newFileSystem(uri, env);
Path targetDir = Paths.get("C:/Temp");
Path pathInZip = zipfs.getPath("/");
Files.list(pathInZip)
.forEach(p -> {
Path targetP = Paths.get(targetDir, p.toString();
Files.createDirectories(targetP.getParent());
Files.copy(p, targetP);
});
Используя базовый Input/OutputStream, необходимо убедиться, что is
не закрывается, вернитесь к библиотеке (IOUtils) / InputStream.transferTo(OutputStream) и всем этим деталям.