Leitura rapida de InputStream

Amigos,
Tenho uma solução funcionando perfeitamente,. mas está lenta devido ao IO, e não estou conseguindo codifcar uma solução mais eficiente que execute a mesma função.

Eu tenho uma thread que fica o tempo todo lendo o InputStream (in), que recebe todos os caracteres que o servidor telnet me envia.
Essa leitura está sendo feita caracter a caracter, e por isso mesmo está lenta, devido a quantidade de IO.
Minha idéia é ler uma quantidade grande de caracteres, transformá-los em uma String, e assim poder tratar e jogar na JTextArea.
Como o servidor telnet envia caracteres não identificados pela JTextArea, eu preciso limpar essa String antes de mandar pra JTextArea.
O código abaixo está funcionando perfeitamente, é exatamente o q que quero, só q está lento, eu queria transformá-lo para executar a mesma tarefa mais rapidamente.

public void run() {
    Thread myThread = Thread.currentThread();
    int ch;
    while (inputThread == myThread) {
        try {
            ch = (char)in.read();
            // Caracteres imprimiveis
            if ((ch > 31 && ch < 127) || (ch == 10)) {
                System.out.print((char)ch);
                displayArea.append((char)ch + "");
                displayArea.setCaretPosition(displayArea.getDocument().getLength());
            }
            // Backspace
            if (ch == '\b') {   
                displayArea.setCaretPosition(displayArea.getCaretPosition() - 1);
                   displayArea.replaceRange(null, displayArea.getCaretPosition(), displayArea.getCaretPosition() + 1);
            }
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
    }
}

Tentei ler bytes[] ao inves de char (reduzir IO), e criar uma String com esses bytes, já q o construtor de String recebe byte[] como parâmetro.
Depois posso tratar essa String e jogar na TextArea.

public void run() {
    Thread myThread = Thread.currentThread();
    byte[] bytes = new byte[1024];
    String str;
    char ch;
    while (inputThread == myThread) {
        try {
            in.read(bytes);
            str = new String (bytes);
            for (int i=0; i<str.length(); i++) {
                ch = str.charAt(i);
                if ((ch > 31 && ch < 127) || (ch == 10)) {
                    System.out.print((char)ch);
                    displayArea.append((char)ch + "");
                    displayArea.setCaretPosition(displayArea.getDocument().getLength());
                }
                if (ch == '\b') {
                    displayArea.setCaretPosition(displayArea.getCaretPosition() - 1);
                    displayArea.replaceRange(null, displayArea.getCaretPosition(), displayArea.getCaretPosition() + 1);
                }
            }
        } catch (Exception e){     
            e.printStackTrace();
        }
    }
}

Além de não ter ficado mais rápido, está imprimindo repetido, parece que se perde no buffer, talvez precisasse dar uma espécie de flush(), mas mesmo assim continua lento.

Tentei ver como usar StringBuffer tb mas não consegui codificar isso.

Agradeço qualquer ajuda.