我正在运行以下程序,并获得流关闭的IO错误。
但仅在第二个循环中。第一个工作正常。
有人可以告诉我为什么吗? (我检查文件是否存在并且不为空。)

    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)


非常感谢你的帮助 :)

最佳答案

您显然不能同时激活两个检索流,这不足为奇。只需重新排序您的代码:

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;
}


您现在做的方式没有任何意义或好处,您只是在浪费空间,而您发现它不起作用。

当然,您会发现,如果其中一个输入超出一个缓冲区,它将不起作用,但是您并没有对此提出疑问。

09-11 17:34