Как преобразовать массив кодов ключей в текст в Java - PullRequest
0 голосов
/ 26 августа 2018

У меня есть Java-программа, которая отправляет некоторые данные по сети.Я также фиксирую все клавиши, нажимаемые на клиенте, и отправляю их на сервер, поэтому сервер поддерживает буфер, содержащий все клавиши, нажимаемые на клиенте.

Мне нужно создать файл, содержащий окончательный текст, созданный клиентом.В качестве примера возьмем следующую последовательность:

press j
press h
press BACKSPACE
press H
press e
press l
press HOME
press DEL
press END
press l
press o

При обработке этой последовательности получается:

Hello

Это простой пример, но обратите внимание, что он также может содержать клавиши со стрелками.

Обработка этого буфера может быть подвержена ошибкам и занимать много времени.Я был бы признателен, если бы кто-нибудь мог представить библиотеку, которая делает эти вещи или показывает простой способ сделать это.

РЕДАКТИРОВАТЬ: Я изменил свой вопрос, чтобы задать конкретный вопрос вместо того, чтобы искатьдля библиотеки.

Я не хочу создавать парсер консоли и нет необходимости в истории или завершении табуляции.Так что мой вопрос отличается от библиотеки, похожей на readline в Java.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

так что нет библиотек для того, что вы хотите сделать.Я бы предложил реализовать свой собственный класс, который собирает все изменения и строит строку по одному нажатию клавиши за раз.Как кикстартер для вас, я написал следующий класс (хотя он, очевидно, должен быть дополнен логикой для дополнительных ключей, которые вы хотите обрабатывать)

public class KeyBuffer {

  private static final String SIMPLE_CHARACTERS = "abcdefghijklmopqrstuvqxyz;?!#$%^&&*()_+";//TODO: extend with all characters that the users can enter

  private String buffer = "";
  private int position = 0;

  private String[] splitAtCurrentPosition() {
    return new String[]{
      buffer.substring(0, position),
      buffer.substring(position, buffer.length() == position ? position : buffer.length())
    };
  }

  private void addCharacter(String character) {
    String[] parts = splitAtCurrentPosition();
    buffer = parts[0].substring(0, parts[0].length()) + character + parts[1];
    position++;
  }

  public void add(String key) {
    if (SIMPLE_CHARACTERS.contains(key)) {
      addCharacter(key);
      return;
    }
    if ("backspace".equals(key) && buffer.length() > 0) {
      String[] parts = splitAtCurrentPosition();
      buffer = parts[0].substring(0, parts[0].length() - 1) + parts[1];
      position --;
    } else if ("arrow_left".equals(key)) {
      if (position > 0) {
        position --;
      }
    } else {
      throw new UnsupportedOperationException("The key " + key + " is not supported");
    }

    //TODO: add logic for all remaining special keys
  }

  @Override
  public String toString() {
    return buffer;
  }
}

Быстро протестировано с помощью следующих тестов 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());
  }

}
0 голосов
/ 26 августа 2018

звучит так, будто вы создаете регистратор ключей.Я думаю, это причина, почему 2 человека уже проголосовали за вас.Забавно, что в данный момент я пишу дипломную работу магистра по таким вещам: P https://github.com/kamiljano/CloudDoorThesis Мой POC не регистрирует ключи, а просто позволяет удаленно скачивать файлы с удаленного устройства.

В любом случае, судя по вашим данным, вы общаетесь с сервером через TCP-сокет.Не надо!Брандмауэр никогда не пропустит вас.Придерживайтесь чего-то более общего, например, HTTP.Тогда вы можете иметь конечную точку, такую ​​как http://server.com/keys, и отправлять ей JSON-запросы, например,

{
  "strokes": [
     "a", "b", "c", "backspace"
  ]
}

Не загружайте свои материалы каждый раз, когда пользователь нажимает кнопку ->, которая генерирует многостресс в сети.Таким образом, вы будете генерировать HTTP-запрос PUT каждые 20 нажатий клавиш или каждую 1 минуту.Убедитесь, что запрос выполняется регистратором ключей в отдельном потоке, или пользователь заметит, что для появления символа на экране требуется 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...