Class TerminalBuilder
Terminal instances with flexible configuration options.
TerminalBuilder provides a fluent API for creating and configuring terminals with various characteristics. It supports multiple implementation providers and handles the complexities of terminal creation across different platforms and environments.
Terminal Providers
JLine supports multiple terminal provider implementations:
- FFM - Foreign Function Memory (Java 22+) based implementation
- JNI - Java Native Interface based implementation
- Exec - Implementation using external commands
- Dumb - Fallback-only implementation with limited capabilities (not included in default provider order)
The provider selection can be controlled using the provider(String) method or the
org.jline.terminal.provider system property. By default, providers are tried in the
order: FFM, JNI, Exec.
Native Library Support
When using providers that require native libraries (such as JNI), the appropriate
native library will be loaded automatically. The loading of these libraries is handled by
JLineNativeLoader for the JNI provider.
The native library loading can be configured using system properties as documented in
JLineNativeLoader.
System vs. Non-System Terminals
TerminalBuilder can create two types of terminals:
- System terminals - Connected to the actual system input/output streams
- Non-system terminals - Connected to custom input/output streams
System terminals are created using system(boolean) with a value of true,
while non-system terminals require specifying input and output streams using
streams(InputStream, OutputStream).
Usage Examples
Creating a default system terminal:
Terminal terminal = TerminalBuilder.builder()
.system(true)
.build();
Creating a terminal with custom streams:
Terminal terminal = TerminalBuilder.builder()
.name("CustomTerminal")
.streams(inputStream, outputStream)
.encoding(StandardCharsets.UTF_8)
.build();
Creating a terminal with a specific provider:
Terminal terminal = TerminalBuilder.builder()
.system(true)
.provider("jni")
.build();
Creating a dumb terminal (with limited capabilities):
Terminal terminal = TerminalBuilder.builder()
.dumb(true)
.build();
- See Also:
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final StringSystem property to control terminal stream closure behavior.static final Stringstatic final Stringstatic final StringSystem property to enable the/dev/ttyfallback for creating a terminal when no system stream is connected to a TTY.static final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final String -
Method Summary
Modifier and TypeMethodDescriptionattributes(Attributes attributes) Attributes to use when creating a non system terminal, i.e. when the builder has been given the input and output streams using thestreams(InputStream, OutputStream)method or whensystem(boolean)has been explicitly called withfalse.build()Create and configure a Terminal instance according to this builder's settings.static TerminalBuilderbuilder()Creates a new terminal builder instance for configuring and creating terminals.color(boolean color) devTty(boolean devTty) Enables or disables the/dev/ttyfallback for creating a terminal when no system stream is connected to a TTY (e.g., when stdin/stdout are pipes).dumb(boolean dumb) Enables or disables thePROP_PROVIDER_DUMB/dumbterminal provider.Set the encoding to use for reading/writing from the console.Set theCharsetto use for reading/writing from the console.exec(boolean exec) Enables or disables thePROP_PROVIDER_EXEC/execterminal provider.ffm(boolean ffm) Enables or disables thePROP_PROVIDER_FFM/ffmterminal provider.getProviders(String provider, IllegalStateException exception) Get the list of available terminal providers.graphemeCluster(boolean graphemeCluster) Controls whether mode 2027 (grapheme cluster segmentation) should be enabled on the terminal after construction.jansi(boolean jansi) Deprecated.Jansi is no longer used in JLine 4.jna(boolean jna) Deprecated.JNA is no longer used in JLine 4.jni(boolean jni) Enables or disables thePROP_PROVIDER_JNI/jniterminal provider.nativeSignals(boolean nativeSignals) paused(boolean paused) Initial paused state of the terminal (defaults to false).Forces the usage of the give terminal provider.Sets the list of providers to try when creating the terminal.static voidsetTerminalOverride(Terminal terminal) Deprecated.This method is deprecated to discourage its use.signalHandler(Terminal.SignalHandler signalHandler) Determines the default value for signal handlers.Initial size to use when creating a non system terminal, i.e. when the builder has been given the input and output streams using thestreams(InputStream, OutputStream)method or whensystem(boolean)has been explicitly called withfalse.stderrEncoding(String encoding) Set the encoding to use for writing to standard error.stderrEncoding(Charset encoding) Set theCharsetto use for writing to standard error.stdinEncoding(String encoding) Set the encoding to use for reading from standard input.stdinEncoding(Charset encoding) Set theCharsetto use for reading from standard input.stdoutEncoding(String encoding) Set the encoding to use for writing to standard output.stdoutEncoding(Charset encoding) Set theCharsetto use for writing to standard output.streams(InputStream in, OutputStream out) system(boolean system) systemOutput(TerminalBuilder.SystemOutput systemOutput) Indicates which standard stream should be used when displaying to the terminal.static Terminalterminal()Returns the default system terminal with automatic configuration.
-
Field Details
-
PROP_ENCODING
- See Also:
-
PROP_STDIN_ENCODING
- See Also:
-
PROP_STDOUT_ENCODING
- See Also:
-
PROP_STDERR_ENCODING
- See Also:
-
PROP_CODEPAGE
- See Also:
-
PROP_TYPE
- See Also:
-
PROP_PROVIDER
- See Also:
-
PROP_PROVIDERS
- See Also:
-
PROP_PROVIDER_FFM
- See Also:
-
PROP_PROVIDER_JNI
- See Also:
-
PROP_PROVIDER_EXEC
- See Also:
-
PROP_PROVIDER_DUMB
- See Also:
-
PROP_PROVIDERS_DEFAULT
-
PROP_FFM
- See Also:
-
PROP_JNI
- See Also:
-
PROP_EXEC
- See Also:
-
PROP_DUMB
- See Also:
-
PROP_DUMB_COLOR
- See Also:
-
PROP_OUTPUT
- See Also:
-
PROP_OUTPUT_OUT
- See Also:
-
PROP_OUTPUT_ERR
- See Also:
-
PROP_OUTPUT_OUT_ERR
- See Also:
-
PROP_OUTPUT_ERR_OUT
- See Also:
-
PROP_OUTPUT_FORCED_OUT
- See Also:
-
PROP_OUTPUT_FORCED_ERR
- See Also:
-
PROP_DEV_TTY
System property to enable the/dev/ttyfallback for creating a terminal when no system stream is connected to a TTY.When set to
"true"and running on a POSIX system where stdin, stdout, and stderr are all pipes (not TTYs), JLine will attempt to open/dev/tty(the controlling terminal) directly and use it for terminal I/O. This allows interactive features to work even when the process was launched with redirected streams (e.g., via Maven'sexec-maven-pluginwith theexec:execgoal).Defaults to
false. Can also be set programmatically viadevTty(boolean).- See Also:
-
PROP_NON_BLOCKING_READS
- See Also:
-
PROP_COLOR_DISTANCE
- See Also:
-
PROP_DISABLE_ALTERNATE_CHARSET
- See Also:
-
PROP_CLOSE_MODE
System property to control terminal stream closure behavior.This property controls what happens when code attempts to read from or write to terminal streams (reader, writer, input, output) after the terminal has been closed.
Two levels of closure enforcement:
- Terminal-level: Calling methods on the terminal itself after
close()always throwsIllegalStateException, regardless of this property. - Stream-level: Using held references to streams obtained before
close()is controlled by this property.
Property values:
"strict"(default in JLine 4.x): Accessing closed streams throwsClosedException"warn"(default in JLine 3.x): Accessing closed streams logs a warning but continues to operate"lenient": Accessing closed streams is silently allowed (no warning, no exception)
Example:
Terminal terminal = TerminalBuilder.terminal(); NonBlockingReader reader = terminal.reader(); // Get reference before close terminal.close(); // This always throws IllegalStateException (terminal-level): terminal.reader(); // throws IllegalStateException // This behavior depends on jline.terminal.closeMode (stream-level): reader.read(); // throws ClosedException in "strict" mode // logs warning in "warn" mode // silently continues in "lenient" mode- See Also:
- Terminal-level: Calling methods on the terminal itself after
-
PROP_FILE_DESCRIPTOR_CREATION_MODE
- See Also:
-
PROP_FILE_DESCRIPTOR_CREATION_MODE_NATIVE
- See Also:
-
PROP_FILE_DESCRIPTOR_CREATION_MODE_REFLECTION
- See Also:
-
PROP_FILE_DESCRIPTOR_CREATION_MODE_DEFAULT
-
PROP_REDIRECT_PIPE_CREATION_MODE
- See Also:
-
PROP_REDIRECT_PIPE_CREATION_MODE_NATIVE
- See Also:
-
PROP_REDIRECT_PIPE_CREATION_MODE_REFLECTION
- See Also:
-
PROP_REDIRECT_PIPE_CREATION_MODE_DEFAULT
-
PROP_GRAPHEME_CLUSTER
- See Also:
-
PROP_PROBE_TIMEOUT
- See Also:
-
PROP_DRAIN_TIMEOUT
- See Also:
-
-
Method Details
-
terminal
Returns the default system terminal with automatic configuration.This method creates a terminal connected to the system's standard input and output streams, automatically detecting the appropriate terminal type and capabilities for the current environment. It's the simplest way to get a working terminal instance for most applications.
The terminal is created with default settings, which include:
- System streams for input and output
- Auto-detected terminal type
- System default encoding
- Native signal handling
This call is equivalent to:
builder().build()Important: Terminals should be closed properly using the
Closeable.close()method when they are no longer needed in order to restore the original terminal state.Example usage:
try (Terminal terminal = TerminalBuilder.terminal()) { terminal.writer().println("Hello, terminal!"); terminal.flush(); // Use terminal... }- Returns:
- the default system terminal, never
null - Throws:
IOException- if an error occurs during terminal creation- See Also:
-
builder
Creates a new terminal builder instance for configuring and creating terminals.This method returns a builder that can be used to configure various aspects of the terminal before creating it. The builder provides a fluent API for setting terminal properties such as name, type, encoding, input/output streams, and more.
Example usage:
Terminal terminal = TerminalBuilder.builder() .name("MyTerminal") .system(true) .encoding(StandardCharsets.UTF_8) .build();- Returns:
- a new terminal builder instance, never
null - See Also:
-
name
-
streams
-
system
-
systemOutput
Indicates which standard stream should be used when displaying to the terminal. The default is to use the system output stream. Building a system terminal will fail if one of the stream specified is not linked to the controlling terminal.- Parameters:
systemOutput- The mode to choose the output stream.- Returns:
- The builder.
-
provider
Forces the usage of the give terminal provider.- Parameters:
provider- TheTerminalProvider's name to use when creating the Terminal.- Returns:
- The builder.
-
providers
Sets the list of providers to try when creating the terminal. If not specified, the system propertyPROP_PROVIDERSwill be used if set. Else, the valuePROP_PROVIDERS_DEFAULTwill be used.- Parameters:
providers- The list ofTerminalProvider's names to check when creating the Terminal.- Returns:
- The builder.
-
jni
Enables or disables thePROP_PROVIDER_JNI/jniterminal provider.The JNI provider uses the JLine native library loaded by
JLineNativeLoaderto access low-level terminal functionality. This provider generally offers the best performance and most complete terminal support.If not specified, the system property
PROP_JNIwill be used if set. If not specified, the provider will be checked for availability.The native library loading can be configured using system properties as documented in
JLineNativeLoader.- Parameters:
jni- true to enable the JNI provider, false to disable it- Returns:
- this builder
- See Also:
-
exec
Enables or disables thePROP_PROVIDER_EXEC/execterminal provider. If not specified, the system propertyPROP_EXECwill be used if set. If not specified, the provider will be checked. -
ffm
Enables or disables thePROP_PROVIDER_FFM/ffmterminal provider. If not specified, the system propertyPROP_FFMwill be used if set. If not specified, the provider will be checked. -
jansi
Deprecated.Jansi is no longer used in JLine 4. Native support is provided automatically via FFM or JNI providers.No-op retained for backwards compatibility with JLine 3.In JLine 3, this method enabled native terminal support via Jansi. JLine 4 replaced Jansi with its own FFM/JNI providers that are used automatically, so this method is no longer needed.
- Parameters:
jansi- ignored- Returns:
- this builder
-
jna
Deprecated.JNA is no longer used in JLine 4. Native support is provided automatically via FFM or JNI providers.No-op retained for backwards compatibility with JLine 3.In JLine 3, this method enabled native terminal support via JNA. JLine 4 replaced JNA with its own FFM/JNI providers that are used automatically, so this method is no longer needed.
- Parameters:
jna- ignored- Returns:
- this builder
-
dumb
Enables or disables thePROP_PROVIDER_DUMB/dumbterminal provider. If not specified, the system propertyPROP_DUMBwill be used if set. If not specified, the provider will be checked. -
devTty
Enables or disables the/dev/ttyfallback for creating a terminal when no system stream is connected to a TTY (e.g., when stdin/stdout are pipes).When enabled and running on a POSIX system where no system stream (stdin, stdout, stderr) is connected to a terminal, JLine will attempt to open
/dev/tty(the controlling terminal) directly and use it for terminal I/O. This allows interactive features like tab completion, syntax highlighting, and history navigation to work even when the process was launched with redirected streams.A common use case is running a JLine application via Maven's
exec-maven-pluginwith theexec:execgoal, which forks a new JVM with piped stdin/stdout.If not specified, the system property
PROP_DEV_TTYwill be used. Defaults tofalse.- Parameters:
devTty- true to enable the /dev/tty fallback- Returns:
- this builder
-
type
-
color
-
encoding
Set the encoding to use for reading/writing from the console. Ifnull(the default value), JLine will automatically select aCharset, usually the default system encoding. However, on some platforms (e.g. Windows) it may use a different one depending on theTerminalimplementation.Use
Terminal.encoding()to get theCharsetthat should be used for aTerminal.This method sets a single encoding for all streams (stdin, stdout, stderr). To set separate encodings for each stream, use
stdinEncoding(Charset),stdoutEncoding(Charset), andstderrEncoding(Charset).- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- Throws:
UnsupportedCharsetException- If the given encoding is not supported- See Also:
-
encoding
Set theCharsetto use for reading/writing from the console. Ifnull(the default value), JLine will automatically select aCharset, usually the default system encoding. However, on some platforms (e.g. Windows) it may use a different one depending on theTerminalimplementation.Use
Terminal.encoding()to get theCharsetthat should be used to read/write from aTerminal.This method sets a single encoding for all streams (stdin, stdout, stderr). To set separate encodings for each stream, use
stdinEncoding(Charset),stdoutEncoding(Charset), andstderrEncoding(Charset).- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- See Also:
-
stdinEncoding
Set the encoding to use for reading from standard input. Ifnull(the default value), JLine will use the value from the "stdin.encoding" system property if set, or fall back to the general encoding.- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- Throws:
UnsupportedCharsetException- If the given encoding is not supported- See Also:
-
stdinEncoding
Set theCharsetto use for reading from standard input. Ifnull(the default value), JLine will use the value from the "stdin.encoding" system property if set, or fall back to the general encoding.- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- See Also:
-
stdoutEncoding
Set the encoding to use for writing to standard output. Ifnull(the default value), JLine will use the value from the "stdout.encoding" system property if set, or fall back to the general encoding.- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- Throws:
UnsupportedCharsetException- If the given encoding is not supported- See Also:
-
stdoutEncoding
Set theCharsetto use for writing to standard output. Ifnull(the default value), JLine will use the value from the "stdout.encoding" system property if set, or fall back to the general encoding.- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- See Also:
-
stderrEncoding
Set the encoding to use for writing to standard error. Ifnull(the default value), JLine will use the value from the "stderr.encoding" system property if set, or fall back to the general encoding.- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- Throws:
UnsupportedCharsetException- If the given encoding is not supported- See Also:
-
stderrEncoding
Set theCharsetto use for writing to standard error. Ifnull(the default value), JLine will use the value from the "stderr.encoding" system property if set, or fall back to the general encoding.- Parameters:
encoding- The encoding to use or null to automatically select one- Returns:
- The builder
- See Also:
-
attributes
Attributes to use when creating a non system terminal, i.e. when the builder has been given the input and output streams using thestreams(InputStream, OutputStream)method or whensystem(boolean)has been explicitly called withfalse.- Parameters:
attributes- the attributes to use- Returns:
- The builder
- See Also:
-
size
Initial size to use when creating a non system terminal, i.e. when the builder has been given the input and output streams using thestreams(InputStream, OutputStream)method or whensystem(boolean)has been explicitly called withfalse.- Parameters:
size- the initial size- Returns:
- The builder
- See Also:
-
nativeSignals
-
signalHandler
Determines the default value for signal handlers. All signals will be mapped to the given handler.- Parameters:
signalHandler- the default signal handler- Returns:
- The builder
-
paused
Initial paused state of the terminal (defaults to false). By default, the terminal is started, but in some cases, one might want to make sure the input stream is not consumed before needed, in which case the terminal needs to be created in a paused state.- Parameters:
paused- the initial paused state- Returns:
- The builder
- See Also:
-
graphemeCluster
Controls whether mode 2027 (grapheme cluster segmentation) should be enabled on the terminal after construction.When enabled, the terminal uses UAX #29 grapheme cluster boundaries for cursor positioning, which allows multi-codepoint characters like ZWJ emoji sequences (e.g., family emoji) to be treated as single display units.
By default (
null), mode 2027 is automatically enabled if the terminal supports it. Set tofalseto explicitly disable grapheme cluster mode even on terminals that support it.This can also be controlled via the system property
PROP_GRAPHEME_CLUSTER.- Parameters:
graphemeCluster-trueto enable,falseto disable, or leave unset for auto-detection- Returns:
- The builder
- See Also:
-
build
Create and configure a Terminal instance according to this builder's settings. If a global terminal override has been set, that instance is returned instead of creating a new one. The method also applies grapheme-cluster mode to the created terminal based on the builder setting or the `org.jline.terminal.graphemeCluster` system property: it may force-enable, disable, or probe-and-enable grapheme-cluster handling on the terminal.- Returns:
- the configured Terminal instance; never
null - Throws:
IOException- if terminal creation or configuration fails
-
computeSystemOutput
-
computeType
-
computeEncoding
-
computeStdinEncoding
-
computeStdoutEncoding
-
computeStderrEncoding
-
getProviders
Get the list of available terminal providers. This list is sorted according to thePROP_PROVIDERSsystem property.- Parameters:
provider- if notnull, only this provider will be checkedexception- if a provider throws an exception, it will be added to this exception as a suppressed exception- Returns:
- a list of terminal providers
-
setTerminalOverride
Deprecated.This method is deprecated to discourage its use. It will remain available but users should avoid it when possible and use proper dependency injection instead.Allows an application to override the result ofbuild(). The intended use case is to allow a container or server application to control an embedded application that uses a LineReader that uses Terminal constructed with TerminalBuilder.build but provides no public api for setting theLineReaderof theTerminal. For example, the sbt build tool uses aLineReaderto implement an interactive shell. One of its supported commands isconsolewhich invokes the scala REPL. The scala REPL also uses aLineReaderand it is necessary to override theTerminalused by the the REPL to share the sameTerminalinstance used by sbt.When this method is called with a non-null
Terminal, all subsequent calls tobuild()will return the providedTerminalregardless of how theTerminalBuilderwas constructed. The default behavior ofTerminalBuildercan be restored by calling setTerminalOverride with a nullTerminalUsage of setTerminalOverride should be restricted to cases where it isn't possible to update the api of the nested application to accept a
instance.- Parameters:
terminal- theTerminalto globally override
-