我想在我的java程序中添加一个“历史”函数,比如bash等,因此按下箭头键应显示以前的发送命令。
将过去的命令写入默认输出是没有问题的,如果箭头向上命中三次且输出不可编辑,则会在三个新行中输出。我希望将programm的输出写入输入字段,这样我只需按Enter键即可重新发送命令。
这可能吗?
亲切的问候
答案 0 :(得分:2)
如果你想推出自己的解决方案,这将让你开始。
您希望从使用缓冲输入更改为直接输入。您可以通过直接与System.in
连接来完成此操作。你应该创建一个线程来处理这个问题,让它在循环中阻塞对System.in.read()
的调用,一次读取一个字节。
每次读取一个字节时,请使用正在读取的当前命令更新您自己的缓冲区。每个输入的字符都会添加到缓冲区中。如果字符是\b
,则删除缓冲区中的最后一个字符。当您检测到\r
或\n
时,请在缓冲区中执行该命令并清除它。
如果收到向上或向下箭头,请向\b
发送一个等于缓冲区长度的System.out
个。这将删除正在输入的任何当前命令的本地副本。然后将新命令打印到System.out
并将其输入缓冲区,替换那里的任何内容。这将允许用户删除它,添加它,或者只需按Enter键提交它。这模仿了bash的功能。
您还可以检测\t
(制表符)字符并实现制表符完成功能。
答案 1 :(得分:2)
查看JLine,它提供命令历史记录,标签完成和行编辑。