如何在java中将密钥代码数组转换为文本

如何在java中将密钥代码数组转换为文本,java,text,Java,Text,我有一个java程序,通过网络发送一些数据。我还捕获客户端上按下的所有键并将它们发送到服务器,因此服务器维护一个包含客户端上按下的所有键的缓冲区 我需要创建一个包含客户端生成的最终文本的文件。以以下顺序为例: press j press h press BACKSPACE press H press e press l press HOME press DEL press END press l press o 处理此序列会产生: Hello 这是一个简单的示例,但请注意,它也可以包含箭头键

我有一个java程序,通过网络发送一些数据。我还捕获客户端上按下的所有键并将它们发送到服务器,因此服务器维护一个包含客户端上按下的所有键的缓冲区

我需要创建一个包含客户端生成的最终文本的文件。以以下顺序为例:

press j
press h
press BACKSPACE
press H
press e
press l
press HOME
press DEL
press END
press l
press o
处理此序列会产生:

Hello
这是一个简单的示例,但请注意,它也可以包含箭头键

处理此缓冲区可能容易出错且耗时。如果有人能介绍一个做这些事情的库或展示一种简单的方法,我将不胜感激

编辑: 我把我的问题改为问一个具体的问题,而不是找图书馆

我不想创建控制台解析器,也不需要历史记录或制表符完成。所以我的问题不同于java中类似readline的库


谢谢。

听起来你在建一个键盘记录器。我想这就是为什么已经有两个人投票否决了你。有趣的是,我正在写关于这类东西的硕士学位论文:P 我的POC不做任何密钥记录,只允许您从远程设备远程下载文件

无论如何,从您的输入判断,您正在通过TCP套接字与服务器通信。不要!防火墙永远不会让你通过。坚持使用更常见的东西,比如HTTP。然后您可以使用一个端点,如,并向其发送JSON请求,如

{
  "strokes": [
     "a", "b", "c", "backspace"
  ]
}
不要每次用户按下按钮->时都上传你的东西,这会给网络带来很大压力。因此,您将每20次按键或每1分钟生成一个HTTP PUT请求。确保该请求由键盘记录程序在单独的线程中完成,否则用户将注意到该字符在屏幕上显示需要0.5-2秒。不要将密钥存储在应用程序的内存中->一旦有10个用户在Facebook上写了一篇新文章,内存就会用完。而是将每个更改存储在数据库中。此时,您首先编写一小段代码,如

String result = "";
for (String key : strokes) {
   if ("backspace".equals(key) && result.size() > 0) {
     result = result.substring(0, result.size() - 2);
   } else if ("del".equals(key) && result.size() > 0) {
     result = result.subscring(1, result.size() - 1);
   } else {
     result += key;
   }
}
updateDatabaseEntry(userId, result);

因此,没有库来存放您想要做的事情。我建议实现您自己的类,该类收集所有更改并一次按一个键创建一个字符串。 作为kickstarter,我为您编写了以下类(尽管它显然需要使用您希望能够处理的其他键的逻辑进行扩展)

通过以下junit测试快速测试:

public class KeyBufferTest {

  @Test
  public void addSimpleCharacter() {
    KeyBuffer buffer = new KeyBuffer();
    buffer.add("a");
    buffer.add("b");
    buffer.add("c");

    assertEquals("abc", buffer.toString());
  }

  @Test
  public void addUsingArrows() {
    KeyBuffer buffer = new KeyBuffer();
    buffer.add("a");
    buffer.add("b");
    buffer.add("arrow_left");
    buffer.add("c");

    assertEquals("acb", buffer.toString());
  }

  @Test
  public void addBackspace() {
    KeyBuffer buffer = new KeyBuffer();
    buffer.add("a");
    buffer.add("b");
    buffer.add("arrow_left");
    buffer.add("backspace");
    buffer.add("c");

    assertEquals("cb", buffer.toString());
  }

}

可能重复的为什么消极点???!可能是因为你似乎没有读过,也没有注意到关于推荐图书馆的问题是离题的。关于“为什么负面观点”的评论——(1)最坏的情况是被认为是投票滥用(因为它可以操纵投票),最好的情况是不需要(因为它不是澄清请求等),所以不要离开它。(2) 通常情况下,如果有人在未留下评论的情况下否决了投票,那么否决理由已经在或结束理由中,或者问题无法得到改进。(3) 如果你还想留下评论,最好用一种更具建设性的方式来表达,或者在meta上提问。关于这个问题:实际上,人们无论如何都会使用图书馆。如果没有库,这个问题要求的太多了--键盘上有大约100个键。谢谢你的回答和建议,但我的问题是解析包含各种键的文本,如箭头、主键、结束键、,字母表和我想要最后的文本。快速答案-没有这个库。详细答案单独附在下面
public class KeyBufferTest {

  @Test
  public void addSimpleCharacter() {
    KeyBuffer buffer = new KeyBuffer();
    buffer.add("a");
    buffer.add("b");
    buffer.add("c");

    assertEquals("abc", buffer.toString());
  }

  @Test
  public void addUsingArrows() {
    KeyBuffer buffer = new KeyBuffer();
    buffer.add("a");
    buffer.add("b");
    buffer.add("arrow_left");
    buffer.add("c");

    assertEquals("acb", buffer.toString());
  }

  @Test
  public void addBackspace() {
    KeyBuffer buffer = new KeyBuffer();
    buffer.add("a");
    buffer.add("b");
    buffer.add("arrow_left");
    buffer.add("backspace");
    buffer.add("c");

    assertEquals("cb", buffer.toString());
  }

}