如何从 InputStream 中过滤 ANSI/Terminal 控制序列?

How to flter ANSI/Terminal Control sequences from InputStream?

我正在使用 pty4j library. My program has a print() method that renders the text to a canvas using the GraphicsContext.fillText() method from javafx. I connect the emulator to an instance of cmd and read ouptput from a buffered reader. Now sadly when it recieves text it also includes ANSI-escape characters 构建一个简单的终端仿真器(见图)。但是,如果我将输出打印到 IDE 或系统控制台,它工作正常。

我尝试使用 BufferedReader 中的 readLine() 方法,然后应用正则表达式,但因为并非所有从终端接收到的输入都以 \n 终止,它会在最后一行阻塞。

Thread terminalReaderThread = new Thread() {
   public void run() {
      try {
         int c;
         while (terminal.isRunning() && (c = terminal.getReader().read()) != -1) {
            if(c != 0){
               print(Character.toString((char)c));
            }
         }

      } catch (IOException e) {
         e.printStackTrace();
      }
  }
};
terminalReaderThread.start();

有没有有效的方法从inputStream中过滤掉这些转义码?

我收到的对我的问题 () 的回答也应该回答你的问题。 如果您阅读标准 (ECMA-48 https://www.ecma-international.org/wp-content/uploads/ECMA-48_5th_edition_june_1991.pdf),您会发现序列总是从 ESCAPE 字符开始,并总是以 FINAL BYTE 结束,该字节具有定义范围内的值。 有了这些信息就足以检测每个序列的开始和结束。 (例如正则表达式)(换行符(和其他 C0 代码)也不允许在转义序列内使用,因此您永远不会有一个不完全位于一行内的转义序列)