Java是否与unputc等效?

时间:2011-01-05 23:23:50

标签: java c io bufferedwriter

我有一个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 个答案:

答案 0 :(得分:3)

是的,请参阅PushbackInputStream

答案 1 :(得分:0)

  

我几乎要回到使用字符串来缓冲当前行。

这是正确的方法:保存整行,不要用它做任何事情,直到用户按下“回车”。他们可能会删除整个内容 - 如果您正在与之通信的进程已经采取了措施,该怎么办?

即。你应该做的是你出于某种原因试图避免做的事情! : - )