Tag: stdin

CLI进程的ThreadPool

我需要通过Java中的stdin将消息传递给CLI PHP进程。 我想在池中运行大约20个PHP进程,这样当我将消息传递给池时,它会将每个消息发送到一个单独的线程,从而保持一个消息队列的传递。 我希望这些PHP进程能够尽可能长时间地保持活着,如果一个人死了就会提出一个新进程。 我看着使用静态线程池执行此操作,但它似乎更适合执行并简单死亡的任务。 我怎么能这样做,用一个简单的接口将消息传递给池? 我是否必须实现自己的自定义“线程池”?

如何使用Scanner停止从标准输入读取多行?

我正在处理一个JAVA赋值应处理多行输入。 指令读作“输入从标准输入读取”。 给出了一个示例输入示例: one 1 two 2 three 3 我不明白上面的示例输入“从stdin读取”是什么意思。 这是我写的一个测试程序,它隔离了我的困惑: import java.io.*; import java.util.Scanner; class Test { public static void main(String[] args) { Scanner stdin = new Scanner(System.in); while(stdin.hasNextLine()) { String line = stdin.nextLine(); String[] tokens = line.split(” “); System.out.println(Integer.parseInt(tokens[1])); } } 当我在控制台中运行这个程序时,它会等待我的输入,每当我输入一行时,它就像我期望的那样回复它。 所以我想也许上面的样本输入可以通过以这种方式输入3行中的每一行来实现。 但是,似乎没有办法结束这个过程。 输入3行后,如何终止输入? 我尝试按两次输入,但这似乎只是一个由换行符组成的行,这会导致错误,因为该行不符合它所期望的2令牌格式。 这是控制台交互的样子: javac Test.java java Test one 1 […]

逐行阅读STDIN的最快方式?

我正在寻找最经济有效的逐行读取STDIN的方法。 第一行是要测试的条件数。 以下所有行都是条件(字符串),最多为100 000个字符。 我已经尝试过以下内容(加上4次90 000个字符的结果: 带有while循环的扫描仪(7255 ms) Scanner sc = new Scanner(System.in); int numberOfLines = Integer.parseInt(sc.nextLine()); long start = 0; int i = 1; while (i<=numberOfLines){ start = System.currentTimeMillis(); sc.nextLine(); Debug.println((System.currentTimeMillis()-start) + "ms for scanner while"); i++; } 结果: 扫描仪3228ms 扫描仪2264ms 扫描仪1309ms 扫描仪454ms 带有for循环的扫描仪(7078 ms) Scanner sc = new Scanner(System.in); int numberOfLines = Integer.parseInt(sc.nextLine()); […]

通过写入stdout并从stdin读取来传递参数,从Java调用exe

我读过这个问题: Java编程:从Java调用exe并传递参数 这个答案足够好了https://stackoverflow.com/a/5604756/2674303 但我还想将参数传递给外部进程的stdin并从此进程的stdout读取。 我怎样才能做到这一点? 我的努力 : 主要方法: public class ProcessBuilderTest { public static void main(String[] args) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder(“C:\\Program Files\\Java\\jdk1.8.0_111\\bin\\java”, “-cp”, //class path key “C:\\Users\\redwhite\\IdeaProjects\\HelloMyWorld\\out\\production\\HelloMyWorld” , // path to class file of ExternalProcess class “call_external.ExternalProcess”); // fully qualified name Process process = pb.start(); OutputStream processOutputStream = process.getOutputStream(); IOUtils.write(“1” […]

如何将stdin重定向到java Runtime.exec?

我想使用Java的Runtime.exec方法执行一些sql脚本。 我打算调用mysql.exe / mysql.sh并将脚本文件重定向到此进程。 从命令提示符我可以运行该命令 <mysqInstallDir\/bin\mysql.exe -u -p < scripts\create_tables.sql 我可以使用Runtime.exec调用mysql.exe但是如何将数据从sql文件重定向到mysql.exe? 我阅读了http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4中的文章,并使用StreamGobbler机制来获取错误和输出流。 没问题。 问题在于使用BufferedReader读取文件“scripts \ create_tables.sql”并将内容传递给prcess的输出流。 我期待Process将数据传递给mysql.exe。 但我看到只有第一行从这个sql文件中读取。 OutputStream outputstream = proc.getOutputStream(); OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream); BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter); while ( (line = br.readLine()) != null) { bufferedwriter.write(line); bufferedwriter.flush(); System.out.println(line); } bufferedwriter.flush(); bufferedwriter.close(); proc.waitFor() 当我这样做时,我看到只执行create_tables.sql中的第一行。 进程的退出代码为0,并且没有其他错误或输出。

在Java中重定向stdin和stdout

我正在尝试重定向java中的子进程的stdin和stdout,最终我将输出转到JTextArea或其他东西。 这是我目前的代码, Process cmd = Runtime.getRuntime().exec(“cmd.exe”); cmd.getOutputStream().write(“echo Hello World”.getBytes()); cmd.getOutputStream().flush(); byte[] buffer = new byte[1024]; cmd.getInputStream().read(buffer); String s = new String(buffer); System.out.println(s); 输出如下: Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\(Current Directory)> 我期待看到输出的“Hello World”字符串。 也许是因为父母的过程没有长久存活? 我也希望能够发送和接收多个命令。

为什么我们不能一次从System.in读取一个字符?

下面的程序打印标准写入的每个字符,但只有在写完新行之后(至少在我的系统上!)。 public class Test { public static void main(String[] args) throws java.io.IOException { int c; while ((c = System.in.read()) != -1) System.out.print((char) c); } } 这可以防止人们写“按任意键继续”等内容并强制执行“按Enter键继续”等操作。 这是什么原因? 它是Java的限制吗? 这种行为依赖于系统(我在Ubuntu上)吗? 它在Mac上如何运作? 视窗? 它是否依赖于我运行应用程序的特定终端? (对我来说,它在Eclipse和gnome-terminal中表现得像这样) 有解决方法吗?

使用重定向的stdin和stdout从Java运行外部程序

我正在尝试从Java程序运行外部程序,我遇到了麻烦。 基本上我想做的就是: Runtime.getRuntime().exec(“./extprogram fileOut”); 但是我发现这不起作用–Java表达式需要使用带有输入和输出流的Process以及其他我没有遇到过的东西。 我已经看过互联网上的一些例子(其中很多来自SO),并且似乎没有一种简单的标准方法可以做到这一点,对于那些不完全了解正在发生的事情的人来说,可能会非常令人沮丧。 我也难以尝试从其他人的代码示例中构建我自己的代码,因为通常看起来大多数其他人1.对重定向stdin不感兴趣,并且2.不一定将stdout重定向到文件,但是而不是System.out 。 那么,是否有人能够指出任何好的简单代码模板的方向来调用外部程序并重定向stdin和stdout ? 谢谢。