如何从 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 代码)也不允许在转义序列内使用,因此您永远不会有一个不完全位于一行内的转义序列)
我正在使用 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中过滤掉这些转义码?
我收到的对我的问题 (