Есть ли Java-эквивалент unputc? - PullRequest
1 голос
/ 06 января 2011

У меня есть BufferedWriter, к которому я использую для записи символов в PipedInputStream. Основано на событиях клавиатуры. Но я реализую обработчик возврата, но я не вижу способа сделать это без unputc.

Я почти возвращаюсь к использованию строки для буферизации текущей строки.

Возможно, я мог бы лучше работать, используя Canvas. (Боже, как я ненавижу Java!)

public class Console extends JTextArea {
    /**
     * 
     */
    private static final long serialVersionUID = 6315506875930497268L;
    private PipedInputStream stdin;
    private PipedOutputStream stdout;
    private PipedOutputStream stderr;
    private boolean bounceKey = true;

    private class Dispatcher implements Runnable {
        InputStream in;

        public Dispatcher(InputStream in) {
            this.in = in;
        }

        @Override
        public void run() {
            Reader input = new BufferedReader(new InputStreamReader(in));
            int c;
            try {
                try {
                    while ((c = input.read()) >= 0) {
                        append(String.valueOf((char) c));
                    }
                } finally {
                    input.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public Console() throws IOException {
        stdin = new PipedInputStream();
        stdout = new PipedOutputStream();
        stderr = new PipedOutputStream();
        final Writer kbd = new BufferedWriter(new OutputStreamWriter(
                new PipedOutputStream(stdin)));

        new Thread(new Dispatcher(new PipedInputStream(stdout))).start();
        new Thread(new Dispatcher(new PipedInputStream(stderr))).start();

        addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                try {
                    char ch = e.getKeyChar();
                    kbd.write(ch);
                    append(String.valueOf(ch));
                    if(ch == '\n') kbd.flush();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                int keycode = e.getKeyCode();
                switch(keycode) {
                case KeyEvent.VK_BACK_SPACE:
                    // Erase the last char from buffer and the screen
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
            } // DONOTHING
        });

        setEditable(false);
        setFocusable(true);
        setBackground(Color.black);
        setForeground(Color.lightGray);
        setFont(new Font("Monospace", Font.BOLD, 12));
        setLineWrap(true);
    }

    public OutputStream getStderr() {
        return stderr;
    }

    public OutputStream getStdout() {
        return stdout;
    }

    public InputStream getStdin() {
        return stdin;
    }

    public boolean isBounceKey() {
        return bounceKey;
    }

    public void setBounceKey(boolean bounceKey) {
        this.bounceKey = bounceKey;
    }
}

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Да, см. PushbackInputStream .

0 голосов
/ 14 сентября 2011

Я почти возвращаюсь к использованию строки для буферизации текущей строки.

Это правильный способ сделать это: сохранить всю строку и ничего не делатьс этим это, пока пользователь не нажимает "ввод".Они могут удалить все это - что, если процесс, с которым вы общаетесь, уже предпринял действие?: -)

...