'Print to a specific point in the terminal
I have a method that prints an upload progress like this:
36% [=================> ] 210,81 KB/s
To rewrite the line, I use the escape charachter '\r'
, which sets the "cursor" to the beginnig of the line.
Everything works as intended, but when i shrink down enough the terminal, it will write it on 2 lines, but when it prints again the line, only the second one is rewrited, and this is due to the escape character.
So what I was thnking about is creating a "checkpiont" in which rewrite the line, but I don't know if that is possible and if yes how to do it.
The following is the method I'm talking about:
private static String progress(MediaHttpDownloader downloader, double deltaSeconds) throws IOException {
int percent = (int) (downloader.getProgress() * 100);
StringBuilder string = new StringBuilder(140)
.append('\r')
.append(String.join("",
Collections.nCopies(percent == 0 ? 2 : 2 - (int) Math.log10(percent), " ")))
.append(percent + "% [")
.append(String.join("", Collections.nCopies(percent, "=")))
.append('>')
.append(String.join("", Collections.nCopies(100 - percent, " ")))
.append("] "
+ humanReadableByteCountSI(getSpeed(Main.CHUNK_SIZE, deltaSeconds))
+ "/s ");
return string.toString();
}
Any suggestions?
Edit: I tried using \b
and it seems to be in conflict with Gradle, so I will have to revert back to the prevoius solution, which still breaks when shrinking down the terminal.
Solution 1:[1]
I used to do the same thing as you, I have 2 suggestions.
1.
You can use the \b
character for a backslash and reproduce everything.
2. You can try https://github.com/ctongfei/progressbar this api, its super simple!
Maven:
<dependency>
<groupId>me.tongfei</groupId>
<artifactId>progressbar</artifactId>
<version>0.5.5</version>
</dependency>
Usage:
ProgressBar pb = new ProgressBar("Test", 100); // name, initial max
// Use ProgressBar("Test", 100, ProgressBarStyle.ASCII) if you want ASCII output style
pb.start(); // the progress bar starts timing
// Or you could combine these two lines like this:
// ProgressBar pb = new ProgressBar("Test", 100).start();
some loop {
...
pb.step(); // step by 1
pb.stepBy(n); // step by n
...
pb.stepTo(n); // step directly to n
...
pb.maxHint(n);
// reset the max of this progress bar as n. This may be useful when the program
// gets new information about the current progress.
// Can set n to be less than zero: this means that this progress bar would become
// indefinite: the max would be unknown.
...
pb.setExtraMessage("Reading..."); // Set extra message to display at the end of the bar
}
pb.stop() // stops the progress bar
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Levi Heßmann |