我可以使用 Java 找到控制台宽度吗?

2022-09-01 00:29:39

有没有办法找到运行 Java 程序的控制台的宽度?

如果可能的话,我希望这是跨平台的...

我不想更改缓冲区或窗口的宽度,我只想知道它的宽度,以便我可以正确格式化正在打印到屏幕的文本。


答案 1

这个问题没有可靠的跨平台解决方案。实际上,在某些情况下,不可能知道真正的控制台宽度是多少。

(有关在某些时间和/或某些平台上有效的方法,请参阅其他答案。但要注意限制...)

例如,在 Linux 系统上,您通常可以从 LINES 和 COLUMNS 环境变量中找出名义上的终端尺寸。虽然当您调整某些“终端仿真器”窗口大小时,这些变量会自动更新,但情况并非总是如此。实际上,在通过telnet协议连接的远程控制台的情况下,没有办法将实际的终端尺寸获取到用户的shell中。

编辑:只是为了补充一点,如果用户在启动Java应用程序后在Linux上更改了他/她的xterm的尺寸,Java应用程序将不会收到通知,并且它不会看到反映在其和环境变量副本中的新维度!LINESCOLUMNS

编辑2:我的错误:并且是shell变量,默认情况下它们不会导出到环境中。您可以通过在运行 Java 应用程序之前运行来“修复”此问题。LINESCOLUMNSbashexport COLUMNS LINES


答案 2

实际上,在Java中已经存在一个Java库来做到这一点:JLine 2。(SourceForce上有一个旧版本,但GitHub的链接似乎是最新的。

这在Linux(Mint 14)和Windows(我不知道是什么版本)下使用JLine 2.11对我有用:

terminalWidth = jline.TerminalFactory.get().getWidth();

JLine承诺也会在Mac上工作。

我发现它在Eclipse控制台下返回了不好的宽度(比如!)(但即使是Java的本机控制台在Eclipse下也不起作用!),不幸的是,在Cygwin下也是如此。但是我已经使用检查不合理值()的代码解决了这个问题,并且在这些情况下只使用80。1< 10

JLine 3 的更新(根据标记 — 谢谢,伙计!):

terminalWidth = org.jline.terminal.TerminalBuilder.terminal().getWidth()

推荐