Namira
Namira

Reputation: 25

java.io.IOException: Stream closed ZipInputStream

Below is the code Snippet.

    FileInputStream fin = new FileInputStream(zipFile);
    ZipInputStream zin = new ZipInputStream(fin);
    ZipEntry entry = null;
    String routerListUCM = "";

    try {
        entries:

        while ((entry = zin.getNextEntry()) != null) {
            if (entry.getName().startsWith("routes")) {

                BufferedReader in = new BufferedReader(new InputStreamReader(zin, "UTF-8"));

                if (true) {
                    //parse the xml of the route...

                    DOMParser dp = new DOMParser();

                    dp.parse(in);
                    Element e = (Element) dp.getDocument().getFirstChild();

                    String transferid = e.getElementsByTagName("transferId").item(0).getTextContent();
                    System.out.println("transferId=" + transferid);
                    int fileid = Integer.parseInt(transferid.split("-")[1]);
                    System.out.println("fileid=" + transferid);
                    String userList = e.getElementsByTagName("userList").item(0).getTextContent();
                    System.out.println("userList=" + userList);
                    String routeList = e.getElementsByTagName("routeList").item(0).getTextContent();
                    System.out.println("routeList=" + routeList);
                    routerListUCM = routeList;

                    if (routeList.toLowerCase().indexOf(myname().toLowerCase()) == -1) {
                        //my server is not in the current route...
                        //so skip this route table.
                        continue entries;

                    }
                }
            }
        }
    } catch (Exception e) {
        System.err.println(e.getMessage());
        e.printStackTrace();

    }

in some cases after "continue entries;" and trying for next loop i see "stream close Exception" :/

error:Stream closed

Stack Trace:

java.io.IOException: Stream closed
at java.util.zip.ZipInputStream.ensureOpen(ZipInputStream.java:67)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:116)
at org.parsisys.test.mina.view.SimpleFtplet$beaVersion0_1155.isTransferFinished(SimpleFtplet.java:299)
at org.parsisys.test.mina.view.SimpleFtplet.isTransferFinished(SimpleFtplet.java)
at org.parsisys.test.mina.view.SimpleFtplet.beaAccessisTransferFinished(SimpleFtplet.java)
at org.parsisys.test.mina.view.SimpleFtplet$beaVersion0_1155.onUploadEnd(SimpleFtplet.java:208)
at org.parsisys.test.mina.view.SimpleFtplet.onUploadEnd(SimpleFtplet.java)
at org.apache.ftpserver.ftplet.DefaultFtplet.afterCommand(DefaultFtplet.java:89)
at org.parsisys.test.mina.view.SimpleFtplet.afterCommand(SimpleFtplet.java)
at org.apache.ftpserver.ftpletcontainer.impl.DefaultFtpletContainer.afterCommand(DefaultFtpletContainer.java:144)
at org.apache.ftpserver.impl.DefaultFtpHandler.messageReceived(DefaultFtpHandler.java:220)
at org.apache.ftpserver.listener.nio.FtpHandlerAdapter.messageReceived(FtpHandlerAdapter.java:61)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:716)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.ftpserver.listener.nio.FtpLoggingFilter.messageReceived(FtpLoggingFilter.java:85)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:75)
at org.apache.mina.filter.logging.MdcInjectionFilter.filter(MdcInjectionFilter.java:136)
at org.apache.mina.filter.util.CommonEventFilter.messageReceived(CommonEventFilter.java:70)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:427)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:245)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:75)
at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:780)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:772)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:714)
at java.lang.Thread.run(Thread.java:748)

Please Help Me....................................................................................................................................................................................................................................................

Upvotes: 2

Views: 5203

Answers (3)

Gio Italy
Gio Italy

Reputation: 141

If you can implemet a logic to understand if there aren't more "routes" to read, at the end of If block you can insert a break instruction to exit the while block and avoid to attempt to read the closed stream

Upvotes: 0

Gabe Gates
Gabe Gates

Reputation: 1030

I found using the org.apache.poi.util.CloseIgnoringInputStream worked for me. I was able to wrap the ZipInputStream that I was passing into another method.

For example:

ExcelUtility.getLineCount(new CloseIgnoringInputStream(zipStream)

Upvotes: 0

Laplas
Laplas

Reputation: 771

It seems that your outermost BufferedReader object closes your nested streams (in particular ZipInputStream). Try to move your BufferedReader initalization code higher the looping logic.

Also this topic might be helpful: closing nested streams.

Update: Ok, now everything is clear. Implementation code of DOMParser class shows clearly that parse method closes underlying InputStream source (just an excerpt of finally block):

} finally {
    this.parser.reader.close();
}

What can be done in this situation is hacking your BufferedReader which is passed to DOMParser object. Here's an example:

public class HackedReader extends BufferedReader {

    public HackedReader(InputStreamReader inputStreamReader) {
        super(inputStreamReader);
    }

    @Override
    public void close() {
        // Close method doesn't do anything, that's the main sense of overriding.
    }

    // But you know exact method which will close your underlying stream.
    public void hackedClose() throws IOException {
        super.close();
    }
}

Upvotes: 2

Related Questions