首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java错误IOException

java错误IOException
EN

Stack Overflow用户
提问于 2018-04-29 00:49:51
回答 1查看 69关注 0票数 0

这段代码给了我一个错误,当我在同一个应用程序中通过键盘获取多个数据时,它给出了一个IOException错误;

在离开do while时出现错误

我不知道他为什么会犯这种错误。

代码语言:javascript
复制
 public static String datoString() {
// Entorno:
    BufferedReader br;

    String frase;
    boolean esCorrecto;
    //Algoritmo
    frase=null;
    br = new BufferedReader(new InputStreamReader(System.in));
    try {
        do {

            System.out.println("Introduce una cadena");
            frase = br.readLine();
            esCorrecto = true;


        } while (!esCorrecto);

    } catch (IOException ioe) {
        System.err.println("Error I/O");
    }
    try {
        br.close();
    } catch (IOException ioe2) {
        ioe2.printStackTrace();
    }//Fin try


    return frase;

}
EN

回答 1

Stack Overflow用户

发布于 2018-04-29 01:11:38

通过这样做

代码语言:javascript
复制
 br.close();

你实际上是在这么做

代码语言:javascript
复制
System.in.close();

因为BufferedReader关闭了底层流。

这使得System.in流不再可用。你需要做的,是做一个小把戏来防止System.in关闭。为此,您可以使用以下包装器

代码语言:javascript
复制
public class ShieldedInputStream extends InputStream {

    InputStream source;

    public ShieldedInputStream(InputStream source) {
        this.source = source;
    }

    @Override
    public int read() throws IOException {
        return source.read();
    }

    @Override
    public int read(byte[] b) throws IOException {
        return source.read(b);
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        return source.read(b, off, len);
    }

    @Override
    public long skip(long n) throws IOException {
        return source.skip(n);
    }

    @Override
    public int available() throws IOException {
        return source.available();
    }

    @Override
    public void close() throws IOException {
//        source.close(); // We dont awant to close it!
    }

    @Override
    public void mark(int readlimit) {
        source.mark(readlimit);
    }

    @Override
    public void reset() throws IOException {
        source.reset();
    }

    @Override
    public boolean markSupported() {
        return source.markSupported();
    }
}

并像这样使用它

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

这样可以防止System.in关闭,但仍然允许您通过关闭BufferedReader来释放资源

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

https://stackoverflow.com/questions/50078885

复制
相关文章

相似问题

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