我在下面编写了Java代码,该代码执行另一个名为“ Newsworthy_RB”的Java程序。
Newsworthy_RB.java包含System.out.printlln()和System.err.println()语句。
我希望两个输出都在命令提示符控制台中打印。
为了获得相同的结果必须要做的事情。
下面的程序仅打印out.println()语句,而不打印err.println()语句。
请让我知道下面的代码是否可以按我期望的那样工作?
command = "java -cp .:../sqljdbc.jar SetHash Newsworthy_RB";
Process child1 = Runtime.getRuntime().exec(command);
InputStream in1 = child1.getErrorStream();
InputStream in2 = child2.getInputStream();
while ((c = in1.read()) != -1 || (c = in2.read()) != -1) {
System.out.print((char)c);
}
首先,启动外部程序的首选方法是通过ProcessBuilder
。在文档中Runtime
甚至提到了:
现在,ProcessBuilder.start()是使用修改后的环境启动进程的首选方法。
在ProcessBuilder
你有一个非常方便的方法叫做redirectErrorStream
:
设置此流程生成器的redirectErrorStream属性。
如果此属性为true,则 随后由该对象的start()方法启动的子流程生成的任何错误输出都将与标准输出合并
,以便可以使用Process.getInputStream()方法读取两者。这使得将错误消息与相应的输出关联起来更加容易。初始值为false。
有关如何输出标准误差和标准输出的完整示例:
import java.io.*;
public class Test {
public static void main(String... args) throws IOException {
ProcessBuilder pb =
new ProcessBuilder("java", "-cp", "yourClassPath", "HelloWorld");
pb.redirectErrorStream(true);
Process proc = pb.start();
Reader reader = new InputStreamReader(proc.getInputStream());
int ch;
while ((ch = reader.read()) != -1)
System.out.print((char) ch);
reader.close();
}
}
对您的更新的回复:不,代码与
while ((c = in1.read()) != -1 || (c = in2.read()) != -1)
将不会起作用,因为这read()
是一种阻塞方法,并且您只有一个线程。您唯一的选择是每个输入流使用一个线程,或者(最好)使用将两个输入流合并为一个线程ProcessBuilder.redirectErrorStream
。
是否有一种方法可以只使用一条打印语句,但仍能达到与下面代码中相同的效果?我尝试了在这种情况下无法使用的结束语句,或者我使用了错误的结束语句:
问题内容: 我想像这样打印进度条: 但是这些都应该打印到终端机的同一行,而不是新行。我的意思是,每个新行都应替换上一行,而不是使用而不是。 如何用Java做到这一点? 问题答案: 格式化字符串,如下所示: 注意字符。正是所谓的回车,会将光标移回行的开头。 最后,请确保你使用 并不是
问题内容: 我想更改网页上的某些内容。我也想隐藏一些东西。打印时,有没有办法用CSS做到这一点?我尤其希望能够隐藏一些DIV及其包含的所有DIV。 问题答案: 可以使用单独的打印样式表来实现。该属性是关键:
我必须使用java应用程序打印PDF文件。我尝试过这样的方法: 当我在假打印机上测试时(我使用PDFCreator作为打印机),一切正常,但当我尝试在物理打印机上打印时,什么都没有发生。 然后我用了PDFBox。文件是打印出来的,但文字之间有奇怪的点,在不应该的地方。 那么,也许有人有从java应用程序打印PDF的经验,可以分享这些信息?
这个问题是在电子艺术采访中提出的。 有三条线。第一个线程打印1到10个数字。第二个线程打印从11到20的数字。第三条线从21到30。现在这三个线程都在运行。然而,数字是按不规则的顺序打印的,如1、11、2、21、12等。 如果我想让数字按排序顺序打印,比如1,2。。。我该怎么处理这些线呢?
我正在回答以下面试问题: 一个进程有三个线程。第一个线程打印1 1 1...,第二个打印2 2 2...,第三个打印3 3 3...无休止。你如何安排这三个线程以打印1 2 3 1 2 3... 我想出了下面的代码,使用两个线程打印,但我无法找出如何从第三个线程在这里打印数字的条件。 如何有效地解决这类问题?