Java zipoutputstream to inputstream

Данные из InputStream нужно переписать в ZipOutputStream. Не принимает по данному пункту.

Сейчас мы напишем реализацию метода createZip(Path source) , в котором мы будем архивировать файл, заданный переменной source.
В Java есть специальный класс ZipOutputStream из пакета java.util.zip, который сжимает (архивирует) переданные в него данные.
Чтобы несколько файлов, сжимаемые в один архив, не слиплись вместе, для каждого из них создается специальная сущность — элемент архива ZipEntry .
Т.е. в ZipOutputStream мы сначала кладем ZipEntry , а затем уже записываем содержимое файла.
При записи файл автоматически сжимается, а при чтении — автоматически восстанавливается.
ZipEntry может быть не только файлом, но и папкой.

Чтобы заархивировать файл (создать новый архив и добавить в него файл):
1. Создай новый поток архива ZipOutputStream используя переменную класса zipFile , с помощью метода newOutputStream класса Files .
2. Создай новый элемент архива ZipEntry .
В конструктор ZipEntry передай строку, содержащую имя новой записи.
Имя нужно получить из полного пути source, взять только имя файла и сконвертировать его в String .
3. Добавь в поток архива созданный элемент архива.
4. Перепиши данные из файла, который архивируем в поток архива. Для этого:
4.1. Создай поток InputStream для добавляемого файла source , используя метод newInputStream класса Files
4.2. Сделай цикл, который будет читать данные из InputStream (созданного в п.4.1), пока они там есть и записывать их в ZipOutputStream (созданный в п.1)
4.3. Закрой InputStream , сделай это с помощью try-with-resource s
5. Закрой элемент архива у потока архива
6. Закрой поток архива, сделай это также с помощью try-with-resources
7. Запусти программу и проверь, что файл архивируется

Читайте также:  Chrome downloading html files

Метод createZip должен создавать ZipOutputStream используя поле zipFile и метод Files.newOutputStream.

Метод createZip должен создавать элемент архива ZipEntry c именем файла, полученным из параметра source.

Источник

Java zipoutputstream to inputstream

Кроме общего функционала для работы с файлами Java предоставляет функциональность для работы с таким видом файлов как zip-архивы. Для этого в пакете java.util.zip определены два класса — ZipInputStream и ZipOutputStream

ZipOutputStream. Запись архивов

Для создания архива используется класс ZipOutputStream. Для создания объекта ZipOutputStream в его конструктор передается поток вывода:

ZipOutputStream(OutputStream out)

Для записи файлов в архив для каждого файла создается объект ZipEntry , в конструктор которого передается имя архивируемого файла. А чтобы добавить каждый объект ZipEntry в архив, применяется метод putNextEntry() .

import java.io.*; import java.util.zip.*; public class Program < public static void main(String[] args) < String filename = "notes.txt"; try(ZipOutputStream zout = new ZipOutputStream(new FileOutputStream("output.zip")); FileInputStream fis= new FileInputStream(filename);) < ZipEntry entry1=new ZipEntry("notes.txt"); zout.putNextEntry(entry1); // считываем содержимое файла в массив byte byte[] buffer = new byte[fis.available()]; fis.read(buffer); // добавляем содержимое к архиву zout.write(buffer); // закрываем текущую запись для новой записи zout.closeEntry(); >catch(Exception ex) < System.out.println(ex.getMessage()); >> >

После добавления объекта ZipEntry в поток нам также надо добавить в него и содержимое файла. Для этого используется метод write, записывающий в поток массив байтов: zout.write(buffer); . В конце надо закрыть ZipEntry с помощью метода closeEntry() . После этого можно добавлять в архив новые файлы — в этом случае все вышеописанные действия для каждого нового файла повторяются.

Чтение архивов. ZipInputStream

Для чтения архивов применяется класс ZipInputStream . В конструкторе он принимает поток, указывающий на zip-архив:

ZipInputStream(InputStream in)

Для считывания файлов из архива ZipInputStream использует метод getNextEntry() , который возвращает объект ZipEntry . Объект ZipEntry представляет отдельную запись в zip-архиве. Например, считаем какой-нибудь архив:

import java.io.*; import java.util.zip.*; public class Program < public static void main(String[] args) < try(ZipInputStream zin = new ZipInputStream(new FileInputStream("output.zip"))) < ZipEntry entry; String name; while((entry=zin.getNextEntry())!=null)< name = entry.getName(); // получим название файла System.out.printf("File name: %s \n", name); // распаковка FileOutputStream fout = new FileOutputStream("new" + name); for (int c = zin.read(); c != -1; c = zin.read()) < fout.write(c); >fout.flush(); zin.closeEntry(); fout.close(); > > catch(Exception ex) < System.out.println(ex.getMessage()); >> >

ZipInputStream в конструкторе получает ссылку на поток ввода. И затем в цикле выводятся все файлы и их размер в байтах, которые находятся в данном архиве.

Затем данные извлекаются из архива и сохраняются в новые файлы, которые находятся в той же папке и которые начинаются с «new».

Источник

Java – Convert ZipOutputStream to FileInputStream

but i would like to avoid the filesystem completely , and not create the file.zip.
i think i need to convert the ZipOutputStream into FileInputStream directly
but i could not find a way to do it.

is there an easy way to accomplish this ?

  • i also have the same problem when i extract the file, in order to read it i must create 2 different temporary files – file.zip and file.hex

Best Solution

You just do not have to create FileOutputStream at all. Use ByteArrayOutputStream instead:

ByteArrayOutputStream zipBytes = new ByteArrayOutputStream() ZipOutputStream outZip = new ZipOutputStream(zipBytes); // run your code that adds zip entries. zipBytes.getBytes() // returns array of bytes that contain your zipped information. 
Java – How to read / convert an InputStream into a String in Java

Summarize other answers I found 11 main ways to do this (see below). And I wrote some performance tests (see results below):

Ways to convert an InputStream to a String:

    Using IOUtils.toString (Apache Utils)

 String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8); 
 String result = CharStreams.toString(new InputStreamReader( inputStream, Charsets.UTF_8)); 
 Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; 
 String result = new BufferedReader(new InputStreamReader(inputStream)) .lines().collect(Collectors.joining("\n")); 
 String result = new BufferedReader(new InputStreamReader(inputStream)) .lines().parallel().collect(Collectors.joining("\n")); 
 int bufferSize = 1024; char[] buffer = new char[bufferSize]; StringBuilder out = new StringBuilder(); Reader in = new InputStreamReader(stream, StandardCharsets.UTF_8); for (int numRead; (numRead = in.read(buffer, 0, buffer.length)) > 0; ) < out.append(buffer, 0, numRead); >return out.toString(); 
 StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); return writer.toString(); 
 ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; for (int length; (length = inputStream.read(buffer)) != -1; ) < result.write(buffer, 0, length); >// StandardCharsets.UTF_8.name() > JDK 7 return result.toString("UTF-8"); 
 String newLine = System.getProperty("line.separator"); BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream)); StringBuilder result = new StringBuilder(); for (String line; (line = reader.readLine()) != null; ) < if (result.length() >0) < result.append(newLine); >result.append(line); > return result.toString(); 
BufferedInputStream bis = new BufferedInputStream(inputStream); ByteArrayOutputStream buf = new ByteArrayOutputStream(); for (int result = bis.read(); result != -1; result = bis.read()) < buf.write((byte) result); >// StandardCharsets.UTF_8.name() > JDK 7 return buf.toString("UTF-8"); 
StringBuilder sb = new StringBuilder(); for (int ch; (ch = inputStream.read()) != -1; ) < sb.append((char) ch); >return sb.toString(); 
  1. Solutions 4, 5 and 9 convert different line breaks to one.
  2. Solution 11 can’t work correctly with Unicode text

Performance tests

Performance tests for small String (length = 175), url in github (mode = Average Time, system = Linux, score 1,343 is the best):

 Benchmark Mode Cnt Score Error Units 8. ByteArrayOutputStream and read (JDK) avgt 10 1,343 ± 0,028 us/op 6. InputStreamReader and StringBuilder (JDK) avgt 10 6,980 ± 0,404 us/op 10. BufferedInputStream, ByteArrayOutputStream avgt 10 7,437 ± 0,735 us/op 11. InputStream.read() and StringBuilder (JDK) avgt 10 8,977 ± 0,328 us/op 7. StringWriter and IOUtils.copy (Apache) avgt 10 10,613 ± 0,599 us/op 1. IOUtils.toString (Apache Utils) avgt 10 10,605 ± 0,527 us/op 3. Scanner (JDK) avgt 10 12,083 ± 0,293 us/op 2. CharStreams (guava) avgt 10 12,999 ± 0,514 us/op 4. Stream Api (Java 8) avgt 10 15,811 ± 0,605 us/op 9. BufferedReader (JDK) avgt 10 16,038 ± 0,711 us/op 5. parallel Stream Api (Java 8) avgt 10 21,544 ± 0,583 us/op 

Performance tests for big String (length = 50100), url in github (mode = Average Time, system = Linux, score 200,715 is the best):

 Benchmark Mode Cnt Score Error Units 8. ByteArrayOutputStream and read (JDK) avgt 10 200,715 ± 18,103 us/op 1. IOUtils.toString (Apache Utils) avgt 10 300,019 ± 8,751 us/op 6. InputStreamReader and StringBuilder (JDK) avgt 10 347,616 ± 130,348 us/op 7. StringWriter and IOUtils.copy (Apache) avgt 10 352,791 ± 105,337 us/op 2. CharStreams (guava) avgt 10 420,137 ± 59,877 us/op 9. BufferedReader (JDK) avgt 10 632,028 ± 17,002 us/op 5. parallel Stream Api (Java 8) avgt 10 662,999 ± 46,199 us/op 4. Stream Api (Java 8) avgt 10 701,269 ± 82,296 us/op 10. BufferedInputStream, ByteArrayOutputStream avgt 10 740,837 ± 5,613 us/op 3. Scanner (JDK) avgt 10 751,417 ± 62,026 us/op 11. InputStream.read() and StringBuilder (JDK) avgt 10 2919,350 ± 1101,942 us/op 

enter image description here

Graphs (performance tests depending on Input Stream length in Windows 7 system)

Performance test (Average Time) depending on Input Stream length in Windows 7 system:

 length 182 546 1092 3276 9828 29484 58968 test8 0.38 0.938 1.868 4.448 13.412 36.459 72.708 test4 2.362 3.609 5.573 12.769 40.74 81.415 159.864 test5 3.881 5.075 6.904 14.123 50.258 129.937 166.162 test9 2.237 3.493 5.422 11.977 45.98 89.336 177.39 test6 1.261 2.12 4.38 10.698 31.821 86.106 186.636 test7 1.601 2.391 3.646 8.367 38.196 110.221 211.016 test1 1.529 2.381 3.527 8.411 40.551 105.16 212.573 test3 3.035 3.934 8.606 20.858 61.571 118.744 235.428 test2 3.136 6.238 10.508 33.48 43.532 118.044 239.481 test10 1.593 4.736 7.527 20.557 59.856 162.907 323.147 test11 3.913 11.506 23.26 68.644 207.591 600.444 1211.545 
Java – How to convert a stack trace to a string

Use Throwable.printStackTrace(PrintWriter pw) to send the stack trace to an appropriate writer.

import java.io.StringWriter; import java.io.PrintWriter; // . StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); String sStackTrace = sw.toString(); // stack trace as a string System.out.println(sStackTrace); 
Related Question

Источник

Converting ZipOutputStream to byte[] or ByteArrayOutputStream

send pies

posted 12 years ago

  • Report post to moderator
  • I am having the worst time figuring this out and I haven’t found a solution close to what I need anywhere online.

    We are using EJB, 11g and ADF to create a system where the user can download an xml file and all images pertaining to the xml file in one, clean zip package by clicking a button/link. The download must appear as a standard «Open, Save, Cancel» user prompt ( CUSTOMERS REQUEST)

    I created the xml, I can pull the images from the SQL DB and I believe they are being input into my instance of ZipOutputStream, but the problem is returning the ZipOutputStream. The system plays friendly returning ByteArrayOutputStream pdfs, docs and images so I wanted to return the zip file the same way.

    With our faces-config.xml, I cannot return values exactly how I need to. I have to go through response and context.

    Below is where the files are pulled and stored in the ZipOutputStream.

    And this is where it is returned as a request.

    Note where the bytearray needs to be. Is this possible?

    Источник

    Оцените статью