Java System.in不使用自定义流

时间:2017-04-17 11:21:42

标签: java io system.in

我目前正在使用Java设计聊天应用程序。因此我创建了自己的JFrame。写入System.out的所有内容都会写入JTextArea,我想重定向System.in以使用我的JTextField。我写了一个简单的类应该处理这个:

public class InputField extends InputStream implements KeyListener {
    private JTextField textField;
    private String text = null;


    public InputField(JTextField textField){
        this.textField = textField;

        textField.addKeyListener(this);
    }

    @Override
    public int read() throws IOException {
        //System.out.println("CALLED!");
        while (text == null)
            ;

        int b;

        if (Objects.equals(text, "")) {
            b = -1;
            text = null;
        } else {
            b = text.charAt(0);
            text = text.substring(1, text.length());
        }

        // System.out.println("GIVING: " + b);

        return b;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            text = textField.getText();
            System.out.println("ENTER: "+ text);
            textField.setText("");
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}
}

我的阅读机制:

StringBuilder cmd = new StringBuilder();
int b;

try {
    while ((b = System.in.read()) != -1)
        cmd.append(b);
    // Do something with cmd
} catch (IOException e){}

我第一次输入任何文字并按回车键,它就可以了。输出消息后,调用read()函数,但如果我尝试输入更多文本,则不再调用read()函数。有什么建议可以解决这个问题吗?

查看Folder Object (Outlook) MSDN 图片。

1 个答案:

答案 0 :(得分:1)

第一次按Enter键时,会将text设置为""。然后,此块设置b = -1

if (Objects.equals(text, "")) {
        b = -1;

read返回的值是什么,这使得主循环完成。