![](/img/trans.png)
[英]How can I convert an uncompressed InputStream into a gzip'ed InputStream efficiently?
[英]How can I convert ZipInputStream to InputStream?
我有代碼,其中 ZipInputSream 轉換為字節 [],但我不知道如何將其轉換為輸入流。
private void convertStream(String encoding, ZipInputStream in) throws IOException,
UnsupportedEncodingException
{
final int BUFFER = 1;
@SuppressWarnings("unused")
int count = 0;
byte data[] = new byte[BUFFER];
while ((count = in.read(data, 0, BUFFER)) != -1)
{
// How can I convert data to InputStream here ?
}
}
ZipInputStream 是 InputStream 的子類。
http://download.oracle.com/javase/6/docs/api/java/util/zip/ZipInputStream.html
這是我解決這個問題的方法。 現在我可以將單個文件從 ZipInputStream 獲取到內存作為 InputStream。
private InputStream convertZipInputStreamToInputStream(ZipInputStream in, ZipEntry entry, String encoding) throws IOException
{
final int BUFFER = 2048;
int count = 0;
byte data[] = new byte[BUFFER];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(data, 0, BUFFER)) != -1) {
out.write(data);
}
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
請在下面找到將從 ZIP 存檔中提取所有文件的函數示例。 此功能不適用於子文件夾中的文件:
private static void testZip() {
ZipInputStream zipStream = null;
byte buff[] = new byte[16384];
int readBytes;
try {
FileInputStream fis = new FileInputStream("./test.zip");
zipStream = new ZipInputStream(fis);
ZipEntry ze;
while((ze = zipStream.getNextEntry()) != null) {
if(ze.isDirectory()) {
System.out.println("Folder : "+ze.getName());
continue;//no need to extract
}
System.out.println("Extracting file "+ze.getName());
//at this moment zipStream pointing to the beginning of current ZipEntry, e.g. archived file
//saving file
FileOutputStream outFile = new FileOutputStream(ze.getName());
while((readBytes = zipStream.read(buff)) != -1) {
outFile.write(buff, 0, readBytes);
}
outFile.close();
}
} catch (Exception e) {
System.err.println("Error processing zip file : "+e.getMessage());
} finally {
if(zipStream != null)
try {
zipStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下適用於FileOutputStream :
try (ZipInputStream zin = new ZipInputStream(response.getInputStream())) {
for (ZipEntry zipEntry = zin.getNextEntry(); zipEntry != null; zipEntry = zin.getNextEntry()) {
File f = new File(dir, zipEntry.getName());
try (FileOutputStream fout = new FileOutputStream(f)) {
int len;
byte[] buffer = new byte[1024];
while ((len = zin.read(buffer)) > 0) {
fout.write(buffer, 0, len);
}
zin.closeEntry();
}
}
}
ZipInputStream
允許直接讀取 ZIP 內容:使用getNextEntry()
進行迭代,直到找到要讀取的條目,然后從ZipInputStream
中讀取。
如果您不想只讀取 ZIP 內容,但需要在傳遞到下一步之前對流應用額外的轉換,則可以使用PipedInputStream
和PipedOutputStream
。 這個想法將與此類似(從內存中編寫,甚至可能無法編譯):
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public abstract class FilterThread extends Thread {
private InputStream unfiltered;
public void setUnfilteredStream(InputStream unfiltered) {
this.unfiltered = unfiltered;
}
private OutputStream threadOutput;
public void setThreadOutputStream(OutputStream threadOutput) {
this.threadOutput = threadOutput;
}
// read from unfiltered stream, filter and write to thread output stream
public abstract void run();
}
...
public InputStream getFilteredStream(InputStream unfiltered, FilterThread filter) {
PipedInputStream filteredInputStream = new PipedInputStream();
PipedOutputStream threadOutputStream = new PipedOutputStream(filteredInputStream);
filter.setUnfilteredStream(unfiltered);
filter.setThreadOuptut(threadOutputStream);
filter.start();
return filteredInputStream;
}
...
public void clientCode() {
...
ZipInputStream zis = ...;// get ZIP stream
FilterThread filter = ...; // assign your implementation of FilterThread that transforms your ZipInputStream
InputStream filteredZipInputStream = getFilteredStream(zis, filter);
...
}
郵政編碼相當簡單,但我在將 ZipInputStream 作為 Inputstream 返回時遇到了問題。 出於某種原因,zip 中包含的某些文件的字符被丟棄。 以下是我的解決方案,到目前為止它一直在工作。
private Map<String, InputStream> getFilesFromZip(final DataHandler dhZ,
String operation) throws ServiceFault
{
Map<String, InputStream> fileEntries = new HashMap<String, InputStream>();
try
{
DataSource dsZ = dhZ.getDataSource();
ZipInputStream zipIsZ = new ZipInputStream(dhZ.getDataSource()
.getInputStream());
try
{
ZipEntry entry;
while ((entry = zipIsZ.getNextEntry()) != null)
{
if (!entry.isDirectory())
{
Path p = Paths.get(entry.toString());
fileEntries.put(p.getFileName().toString(),
convertZipInputStreamToInputStream(zipIsZ));
}
}
}
finally
{
zipIsZ.close();
}
}
catch (final Exception e)
{
faultLocal(LOGGER, e, operation);
}
return fileEntries;
}
private InputStream convertZipInputStreamToInputStream(
final ZipInputStream in) throws IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.