# A simple Java CLI (part 2) - Solution
Solution to the [Brief - A simple Java CLI (part 2)](https://hackmd.io/YZIFZiAEQF2DEikHgsskBw).
## What where the prerequisites?
You should be comfortable with topics below. If it not the case, you should learn more about:
- Have assimilated the previous concepts (part 1)
- Understand what folders and files are
- Understand what a path (to a folder or file) is
## What was expected
- Understand the specifications!
- Deliver no more or less than expected :)
- Rely on the solution of part 1
- Better tests before delivery (advice in part 1 solution)
## The code
This is not the unique possible implementation neither a fully optimized implementation, it is not the objective. It goes straight to the point which is satisfying the specifications.
**Challenge:**
But it introduces using a `StringBuilder` instead of string concatenation in the `printenv` command. Building strings can be a costly operation because a `String` object in Java is an array of characters and it is immutable (state cannot change once created); each time you concatenate strings, Java builds new `String` objects. When we need to build dynamically a string and typically in loops it is a far way better solution to use the `StringBuilder` class.
```java=
import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Cli {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("> ");
while (true) {
String commandLine = scanner.nextLine();
String[] tokens = commandLine.split(" ", 2);
String commandName = tokens[0];
String output = "";
if (commandName.equals("exit") || commandName.equals("logout")) {
break;
} else if (commandName.equals("date")) {
output = LocalDate.now().toString();
} else if (commandName.equals("time")) {
output = LocalTime.now().toString();
} else if (commandName.equals("datetime")) {
output = LocalDateTime.now().toString();
} else if (commandName.equals("useraccount")) {
output = System.getProperty("user.name");
} else if (commandName.equals("userhome")) {
output = System.getProperty("user.home");
} else if (commandName.equals("os")) {
String name = System.getProperty("os.name");
String version = System.getProperty("os.version");
output = name + " (" + version + ")";
} else if (commandName.equals("printenv")) {
if (tokens.length == 2) { // Single variable
String name = tokens[1];
String value = System.getenv(name);
if (value != null) {
output = value;
}
} else { // All variables
Map<String, String> variables = System.getenv();
Set<String> keys = variables.keySet();
StringBuilder sb = new StringBuilder();
for (String key : keys) {
sb.append(key);
sb.append("=");
sb.append(variables.get(key));
sb.append(System.lineSeparator());
}
output = sb.toString();
}
} else if (commandName.equals("ls")) {
if (tokens.length == 2) { // We have a path candidate
String path = tokens[1];
File dir = new File(path);
String[] names = dir.list();
if (names != null) { // Denotes a directory
for (String name : names) {
output += name + System.lineSeparator();
}
} else {
output = "Not a directory";
}
} else {
output = "Not a directory";
}
} else if (commandName.equals("echo") || commandName.equals("print")) {
if (tokens.length == 2) {
output = tokens[1];
}
} else {
output = "Command '" + commandName + "' not found.";
}
System.out.println(output);
System.out.print("> ");
}
scanner.close();
System.out.println("Bye!");
}
}
```
## About Java core concepts in this brief
- Data structures: the basic `array`, `Map` (dictionary-like structure with keys and values) and `Set` (contains unique elements)
- `File` class to represent a file on disk and methods to get related information on the file such as its name
- Looping over data structures with the "foreach" enhanced `for` loop also called `foreach` loop
- Computers need to know when we have reached the end of a line, an "end-of-line separator" which is system dependent and that Java has an utility method to retrieve the system running our program specific separator