java.io.IOException: поток закрыт ZipInputStream - PullRequest
0 голосов
/ 09 декабря 2018

Ниже приведен фрагмент кода.

    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();

    }

в некоторых случаях после «продолжить записи»;и пытаясь выполнить следующий цикл, я вижу «Исключение при закрытии потока»: /

error:Stream closed

Трассировка стека:

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)

Пожалуйста, помогите мне ....................................................................................................................................................................................................................................................

1 Ответ

0 голосов
/ 09 декабря 2018

Кажется, что ваш самый внешний BufferedReader объект закрывает ваши вложенные потоки (в частности ZipInputStream).Попробуйте переместить код инициализации BufferedReader выше логики зацикливания.

Также эта тема может быть полезна: закрытие вложенных потоков .

Обновление: Ok, теперь все понятно.Код реализации класса DOMParser ясно показывает, что метод parse закрывает базовый InputStream источник (только фрагмент блока finally):

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

Что может быть сделано в этой ситуации - это взломать ваш BufferedReader который передается объекту DOMParser.Вот пример:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...