我想从我的Java程序中使用一个linux命令行工具。 我启动程序并使用Process类获取输出( http://download.oracle.com/javase/6/docs/API/java/lang/Process.HTML ):
/* @param args * @throws IOException */ public static voID main(String[] args) throws IOException { Process proc = Runtime.getRuntime().exec("octave"); BufferedReader reader = new BufferedReader(new inputStreamReader(proc.getinputStream())); BufferedReader errorReader = new BufferedReader(new inputStreamReader(proc.getinputStream())); BuffereDWriter writer = new BuffereDWriter(new OutputStreamWriter(proc.getoutputStream())); int c; while((c = proc.getinputStream().read()) != -1) { System.out.print((char)c); } System.out.println("End"); }
我得到以下输出:
GNU Octave版本3.0.5版权所有(C)2008 John W. Eaton等人。 这是免费软件; 请参阅复制条件的源代码。 绝对没有担保; 甚至不适用于适销性或针对特定用途的适用性。 有关详细信息,请input`保修'。
Octaveconfiguration为“i486-pc-linux-gnu”。
有什么办法强制Python在windows上使用64位整数?
更改进程名称而不更改linux中的argv
如何从.NET应用程序启动`powercfg.exe -energy`?
过程内存映射中的文本部分
环境variables强制.NET应用程序运行为32位
有关Octave的更多信息,请访问http://www.octave.org 。
如果您觉得这个软件有用,请投稿。 有关更多信息,请访问http://www.octave.org/help-wanted.HTML
报告错误(但首先,请阅读http://www.octave.org/BUGs.HTML了解如何撰写有用的报告)。
有关以前版本的更改信息,请键入“news”。
奇怪的是正常的输出,如果我在terminal运行八度是如下:
:〜/ workspace / Console / src / c $ octave
GNU Octave版本3.0.5版权所有(C)2008 John W. Eaton等人。 这是免费软件; 请参阅复制条件的源代码。 绝对没有担保; 甚至不适用于适销性或针对特定用途的适用性。 有关详细信息,请input`保修'。
Octaveconfiguration为“i486-pc-linux-gnu”。
有关Octave的更多信息,请访问http://www.octave.org 。
如果您觉得这个软件有用,请投稿。 有关更多信息,请访问http://www.octave.org/help-wanted.HTML
报告错误(但首先,请阅读http://www.octave.org/BUGs.HTML了解如何撰写有用的报告)。
有关以前版本的更改信息,请键入“news”。
八度:1>
所以请求input的行中的字符不会在我的inputstream中发送。 为什么? 是不是可以检测是否要求input?
感谢您的回答!
海因里希
importError:没有在windows上使用django_MysqL命名termios的模块
有没有一种方法来识别windows命令提示符而不pipe文件名或位置?
windows SDK – C# – deBUGging进程退出,错误代码为-1073741502
C#:防止subprocesslocking来电显示文件夹
进程组中的进程是否应该在Unix / linux中与其父进程一起终止?
* nix上的程序可以检测它们是否正在与终端或另一个流进行通话。 许多交互式shell程序在这个基础上做出了不同的反应(通过设置不同的提示符,而不是读取一些init文件甚至根本不启动)。
你可能会遇到这种情况之一。
此外,也许使用一个Java API的八度可能是更简单的方法: 例如 , joPAS 。
由于你的问题出现八度特定,我建议使用 – 八度的 – 选项,并在命令行中传递所有参数在一个单一的命中。 这将解决前面关于启动终端会话的问题。
你没有得到提示,“八度:1>”,因为八度的输出被缓冲。 如果输出不是交互式设备,许多在Unix / linux上使用stdio的程序将做同样的事情。 直到缓冲区填满(自动刷新)或缓冲区被调用fflush(3)的程序显式刷新后,才会收到输出。
如果你真的想与一个命令行程序交互,那么你需要使用一个pty(我从来没有尝试过使用java,但是我不知道这是可能的)。
摘自“man stdio”,解释发生了什么事情:
At program startup,three text streams are predefined and need not be opened explicitly -- standard input (for reading conventional input),standard output (for writing conventional input),and standard error (for writing diagnostic output). These streams are abbreviated stdin,stdout and stderr. When opened,the standard error stream is not fully buffered; the standard input and output streams are fully buffered if and only if the streams do not to refer to an interactive device. Output streams that refer to terminal devices are always line buffered by default; pending output to such streams is written automatically whenever an input stream that refers to a terminal device is read. In cases where a large amount of computation is done after printing part of a line on an output terminal,it is necessary to fflush(3) the stan- dard output before going off and computing so that the output will appear.
难道它会为这个提示打开一个新的文件描述符?
你可能会发现,在八度的源代码(或readline源代码,如果八度使用)。
我终于可以解决这个问题了:在linux下,使用octave和–interactive,最后是–no-line-editing选项,它工作:)
海因里希
总结以上是内存溢出为你收集整理的使用Java中的命令行工具进行通信全部内容,希望文章能够帮你解决使用Java中的命令行工具进行通信所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)