首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedReaders跨类读取System.in

BufferedReaders跨类读取System.in
EN

Stack Overflow用户
提问于 2014-03-03 01:23:23
回答 1查看 181关注 0票数 0

我想知道为什么在使用

代码语言:javascript
复制
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

在两个不同的班级。

设置如下。

代码语言:javascript
复制
public class SomeClass{

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //br.readSomeStuff
    br.close();

    new SomeOtherClass(); //defo not passing the br along to the new class!

}
public class SomeOtherClass{

    public SomeOtherClass(){
        method():
    }

    private void method(){
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
        br.readLine();
        // results into an IOEXCEPTION Stream close
    }

}

当我在创建第一个类之后关闭第一个类中的BufferedReader时,这个问题就消失了。我不明白为什么这会带来问题。我正在System.in上创建一个新的System.in,为什么这可能会导致流关闭错误?

类似的问题here。但是,没有解释为什么System.in会因为某种原因而关闭。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-03 01:29:48

因为当您关闭BufferedReader时,所有的底层流都关闭了。THis是所有包装和从流到流的读/写类的例子。

这是一种方便,因此您不需要遍历实例化的整个对象集( InputStreamInputStreamReader,最后是BufferedReader)并关闭所有对象。

一个简单的测试将证明这一点:

代码语言:javascript
复制
public static void main(String[] args) throws IOException 
{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    br.close();

    // Will throw IOException
    int i = System.in.read();
}

System.in不是特别的;它是一个InputStream。如果底层流是一个FileInputStream而不是stdin,也会发生同样的事情。

代码语言:javascript
复制
public static void main(String[] args) throws IOException 
{
    File f = new File("SomeFileName");
    FileInputStream fis = new FileInputStream(f);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    br.close();

    // throw IOException
    int i = fis.read();
}

考虑到这些构造函数通常是链式的(在您的示例中是这样的),必须保留和关闭每个构造函数将非常麻烦。

想象一下,每次您想要使用流时都必须执行以下操作:

代码语言:javascript
复制
public static void main(String[] args) throws IOException 
{
    File f = new File("SomeFileName");
    FileInputStream fis = new FileInputStream(f);
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader br = new BufferedReader(irs);

    // Use the BufferedReader

    br.close();
    isr.close();
    fis.close();

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22136137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档