Ошибка Java IOException - PullRequest
       9

Ошибка Java IOException

0 голосов
/ 28 апреля 2018

Этот код выдает мне ошибку, когда я беру несколько данных с клавиатуры в одном приложении, он выдает ошибку IOException;

выдает ошибку при выходе из do while

Я не знаю, почему он совершает такую ​​ошибку.

 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;

}

1 Ответ

0 голосов
/ 28 апреля 2018

Делая это

 br.close();

Вы на самом деле делаете это

System.in.close();

Поскольку BufferedReader закрывает основной поток.

Это делает поток System.in более недоступным для использования. Что вам нужно сделать, это сделать небольшой трюк, чтобы предотвратить System.in от закрытия. Для этого вы можете использовать следующую оболочку

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

И используйте это так

br = new BufferedReader(new InputStreamReader(new ShieldedInputStream(System.in)));

Таким образом, вы предотвратите закрытие System.in, но при этом сможете освободить ресурсы, закрыв BufferedReader

...