几年前我创建了一个库来在终端中进行渲染。2025 年再次运行它时,它有部分损坏。
这是一个隔离问题的小例子:
TerminalCols.java
package p5_terminal_graphics_examples;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class TerminalCols {
public static void main(String[] args) {
while (true) {
int cols = cols();
System.out.println("Terminal columns: " + cols);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static public int cols() {
return Integer.parseInt(cmd("tput cols"));
}
static public String cmd(String args) {
return exec("sh", "-c", args);
}
static public String exec(String... cmd) {
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Process p;
p = Runtime.getRuntime().exec(cmd);
int c;
InputStream in = p.getInputStream();
while ((c = in.read()) != -1) {
bout.write(c);
}
in = p.getErrorStream();
while ((c = in.read()) != -1) {
bout.write(c);
}
p.waitFor();
String result = new String(bout.toByteArray());
return result.trim();
}
catch (IOException | InterruptedException e) {
return null;
}
}
}
上述代码应打印出终端每秒的列数。但它始终打印默认值 80。
tput cols
如果我直接在终端中输入那么它总是返回正确的答案。
所以随着时间的推移,有些东西出现了问题,我不知道如何继续解决这个问题。任何帮助都欢迎。
tput
必须能够访问终端才能获取终端属性。尝试 :
ProcessBuilder
注意,如果你使用and ,你也可以直接调用 tcols 而不需要“sh”或 shell 重定向“2>/dev/tty”.redirectInput(Redirect.INHERIT)
。这应该会给出调用 tcols 的预期结果: