在Java应用程序中,我使用了对的调用System.out.println()。现在,我想找到一种以编程方式删除此内容的方法。
我在Google上找不到任何解决方案,所以有什么提示吗?
在Java应用程序中,我使用了对的调用System.out.println()。现在,我想找到一种以编程方式删除此内容的方法。
我在Google上找不到任何解决方案,所以有什么提示吗?
Answers:
您可以将退格字符打印的\b次数与之前打印的字符相同。
System.out.print("hello");
Thread.sleep(1000); // Just to give the user a chance to see "hello".
System.out.print("\b\b\b\b\b");
System.out.print("world");
注意:这在Mars(4.5)之前的旧版本的Eclipse控制台中无法正常工作。但是,这在命令控制台中可以正常工作。另请参阅如何使退格\ b在Eclipse的控制台中工作?
不支持使用Java清除屏幕,但是您可以尝试一些技巧来实现此目的。
a)使用依赖于操作系统的命令,例如对于Windows:
Runtime.getRuntime().exec("cls");
b)放一堆新行(这使人怀疑屏幕不清晰)
c)如果您想关闭System.out,可以尝试以下操作:
System.setOut(new PrintStream(new OutputStream() {
@Override public void write(int b) throws IOException {}
}));
throws是,方法主体不会引发异常。但这都是挑剔的。
您可以使用光标向上删除行,擦除文本,或者简单地用新文本覆盖旧文本。
int count = 1;
System.out.print(String.format("\033[%dA",count)); // Move up
System.out.print("\033[2K"); // Erase line content
或清除屏幕
System.out.print(String.format("\033[2J"));
这是标准的,但根据维基百科,Windows控制台不遵循它。
我正在使用blueJ进行Java编程。有一种方法可以清除其终端窗口的屏幕。尝试这个:-
System.out.print ('\f');
这将清除此行之前打印的内容。但这在命令提示符下不起作用。
System.out是PrintStream,并且本身不提供任何方式修改获取输出的内容。根据支持该对象的内容,您可能会或可能无法对其进行修改。例如,如果您要重定向System.out到日志文件,则可以在事后修改该文件。如果直接进入控制台,则文本到达控制台缓冲区的顶部后将消失,但是无法以编程方式对其进行处理。
我不确定您到底想完成什么,但是您可能要考虑创建一个代理PrintStream以在消息得到输出时过滤消息,而不是在事后尝试删除它们。
\r吗?它可以跳回到该行的开头并创建包含更新信息的行...
\b),但\r 不同环境对它的解释不同。我的回答的重点是,即使这System.out是直接在控制台上进行的(这是Java程序的默认行为),您也不应假定它将始终在此进行。可能是将内容发送到文件中,在这种情况下,您将得到一个文件,其中包含要删除的文本和特殊字符。
要清除“输出”屏幕,您可以按CTRL+来模拟一个真实的人L(清除输出)。您可以通过使用Robot()类来实现此目标,方法如下:
try {
Robot robbie = new Robot();
robbie.keyPress(17); // Holds CTRL key.
robbie.keyPress(76); // Holds L key.
robbie.keyRelease(17); // Releases CTRL key.
robbie.keyRelease(76); // Releases L key.
} catch (AWTException ex) {
Logger.getLogger(LoginPage.class.getName()).log(Level.SEVERE, null, ex);
}
我发现在Eclipse Mars中,如果可以安全地假设替换它的行至少与要擦除的行一样长,只需打印'\ r'(回车)就可以使光标返回到行首以覆盖您看到的所有字符。我想如果新行较短,则可以用空格来弥补不同之处。
在日食中,此方法对于实时更新进度百分比非常方便,例如在我从其中一个程序中摘录的代码段中。它是从网站下载媒体文件的程序的一部分。
URL url=new URL(link);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.connect();
if(connection.getResponseCode()!=HttpURLConnection.HTTP_OK)
{
throw new RuntimeException("Response "+connection.getResponseCode()+": "+connection.getResponseMessage()+" on url "+link);
}
long fileLength=connection.getContentLengthLong();
File newFile=new File(ROOT_DIR,link.substring(link.lastIndexOf('/')));
try(InputStream input=connection.getInputStream();
OutputStream output=new FileOutputStream(newFile);)
{
byte[] buffer=new byte[4096];
int count=input.read(buffer);
long totalRead=count;
System.out.println("Writing "+url+" to "+newFile+" ("+fileLength+" bytes)");
System.out.printf("%.2f%%",((double)totalRead/(double)fileLength)*100.0);
while(count!=-1)
{
output.write(buffer,0,count);
count=input.read(buffer);
totalRead+=count;
System.out.printf("\r%.2f%%",((double)totalRead/(double)fileLength)*100.0);
}
System.out.println("\nFinished index "+INDEX);
}
我找到了在Eclipse IDE中擦除控制台的解决方案。它使用机器人类。请查看下面的代码和标题以获取解释:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
public void wipeConsole() throws AWTException{
Robot robbie = new Robot();
//shows the Console View
robbie.keyPress(KeyEvent.VK_ALT);
robbie.keyPress(KeyEvent.VK_SHIFT);
robbie.keyPress(KeyEvent.VK_Q);
robbie.keyRelease(KeyEvent.VK_ALT);
robbie.keyPress(KeyEvent.VK_SHIFT);
robbie.keyPress(KeyEvent.VK_Q);
robbie.keyPress(KeyEvent.VK_C);
robbie.keyRelease(KeyEvent.VK_C);
//clears the console
robbie.keyPress(KeyEvent.VK_SHIFT);
robbie.keyPress(KeyEvent.VK_F10);
robbie.keyRelease(KeyEvent.VK_SHIFT);
robbie.keyRelease(KeyEvent.VK_F10);
robbie.keyPress(KeyEvent.VK_R);
robbie.keyRelease(KeyEvent.VK_R);
}
假设您尚未在Eclipse中更改默认的热键设置并导入这些Java类,则此方法应该起作用。
BalusC的答案对我不起作用(Ubuntu上的bash控制台)。该行的末尾还有一些东西。所以我又用空格翻了翻。Thread.sleep()在下面的代码段中使用,因此您可以查看发生了什么。
String foo = "the quick brown fox jumped over the fence";
System.out.printf(foo);
try {Thread.sleep(1000);} catch (InterruptedException e) {}
System.out.printf("%s", mul("\b", foo.length()));
try {Thread.sleep(1000);} catch (InterruptedException e) {}
System.out.printf("%s", mul(" ", foo.length()));
try {Thread.sleep(1000);} catch (InterruptedException e) {}
System.out.printf("%s", mul("\b", foo.length()));
其中mul的简单方法定义为:
private static String mul(String s, int n) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < n ; i++)
builder.append(s);
return builder.toString();
}
(Guava的Strings类也提供了类似的repeat方法)
我已成功使用以下内容:
@Before
public void dontPrintExceptions() {
// get rid of the stack trace prints for expected exceptions
System.setErr(new PrintStream(new NullStream()));
}
NullStream包含在import com.sun.tools.internal.xjc.util包中,因此可能并非在所有Java实现中都可用,但这只是一个OutputStream,应该足够简单以编写自己的Java 。
如果要删除一些System.out.println()输出,则此解决方案适用。它将输出限制为在控制台上打印并打印其他输出。
PrintStream ps = System.out;
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {}
}));
System.out.println("It will not print");
//To again enable it.
System.setOut(ps);
System.out.println("It will print");