流封闭IO异常Java

问题描述 投票:1回答:1

我正在运行以下程序并获得Stream Closed IO Error。但只在第二个循环中。第一个工作正常。谁能告诉我为什么? (我检查了文件是否存在而不是空的。)

    private static TimerTask perform(){
        //logging on to FTP-Server

            InputStream  in = client.retrieveFileStream("./htdocs/pwiMain/main.txt");
            InputStream pw = client.retrieveFileStream("./htdocs/pwiMain/cred_pwd.txt");
            BufferedInputStream inbf = new BufferedInputStream(in);
            int bytesRead;
            byte[] buffer = new byte[1024];
            String wholeFile = null;
            String[] contents;
            while((bytesRead = inbf.read(buffer)) != -1){
                wholeFile = new String(buffer,0,bytesRead);
            }
            sentPassword = wholeFile.substring(wholeFile.indexOf("#lap"));
            inbf.close();

            inbf = new BufferedInputStream(pw);
            while((bytesRead = inbf.read(buffer)) != -1){ // this is line72 where the error occurrs...
                wholeFile = new String(buffer,0,bytesRead);
            }
            md5hash = wohleFile;
            inbf.close();
            contents = sentPassword.split("\\r\\n|\\n|\\r");
            System.out.println("contents:    " + contents[0] + "   " + contents[1]);

            //check the password


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("ioexception");
        } finally {

        }
        return null;
    }

这是错误消息:

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at com.protonmail.taylor.faebl.development.main.perform(main.java:72)
    at com.protonmail.taylor.faebl.development.main.main(main.java:23)

非常感谢你的帮助 :)

java inputstream ioerror
1个回答
3
投票

你显然不能同时激活两个检索流,这并不奇怪。只需重新排序代码:

private static TimerTask perform(){
    try {
        //logging on to FTP-Server

        InputStream  in = client.retrieveFileStream("./htdocs/pwiMain/main.txt");
        BufferedInputStream inbf = new BufferedInputStream(in);
        int bytesRead;
        byte[] buffer = new byte[1024];
        String wholeFile = null;
        String wholeCred = null;
        String[] contents;
        while((bytesRead = inbf.read(buffer)) != -1){
            wholeFile = new String(buffer,0,bytesRead);
        }
        inbf.close();  // ADDED

        InputStream pw = client.retrieveFileStream("./htdocs/pwiMain/cred_pwd.txt");
        BufferedInputStream pwbf = new BufferedInputStream(pw);
        int pwBytesRead; // YOU DON'T NEED THIS, you could reuse the previous one
        byte[] pwBuffer = new byte [1024]; // DITTO
        while((pwBytesRead = pwbf.read(pwBuffer)) != -1){
            wholeCred = new String(pwBuffer,0,pwBytesRead);
        }
        pwbf.close(); // ADDED

        sentPassword =  wholeFile.substring(sentPassword.indexOf("#lap"));
        md5hash = wholeCred;
        contents = sentPassword.split("\\r\\n|\\n|\\r");
        System.out.println("contents:    " + contents[0] + "   " + contents[1]);

        //check the password


    } catch (IOException e) {
            // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("ioexception");
    } finally {

    }
    return null;
}

你现在的方式没有任何意义或优势,你只是浪费空间,而你发现它不起作用。

当然,您会发现,如果其中一个输入超过一个缓冲区,它将无法工作,但您没有问过这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.