2 frinday Frinday 于 2015.07.08 23:46 提问

Runtime.getRuntime().exec(is.readLine());遇到问题

程序没报错,执行到Runtime.getRuntime().exec(is.readLine());时没看到任何效果,也不继续执行接下来的代码。is.readLine() 是"cmd /k start E://test.txt"。

public class Server {
public static void main(String [] args) {
try {
ServerSocket sersoc = null;
try {
sersoc = new ServerSocket(8399);
} catch (Exception e) {
// TODO: handle exception
}
Socket socket = null;
try {
socket = sersoc.accept();
} catch (Exception e) {
System.out.println("Error."+e);
}
String line = null;
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

        System.out.println(is.readLine());
        Runtime.getRuntime().exec(is.readLine());

        while(!line.equals("bye")){
            os.println(line);
            System.out.println("Server:" + line);
            System.out.println("Client:" + is.readLine());
            line = sin.readLine();
        }
        os.close();
        is.close();
        sersoc.close();
        socket.close();
    }catch (Exception e) {
        // TODO: handle exception
        System.out.println(e);
    }
}

}

6个回答

tongyi55555
tongyi55555   2015.07.09 10:15
已采纳

不能使用两次readLine方法,因为第一次已经读取了内容,下次exec的时候是处于等待输入的状态,他读取不出来了,所以没有执行,会一直等待输入。解决办法就是第一次读取的时候将其转换为变量,修改如下:

String command = is.readLine();
System.out.println(command);
Runtime.getRuntime().exec(command);

修改为上面的即可执行操作了,前提是你的command已经传过来了啊。

你这个代码只是server端的,看不到你的client端是怎么写的,因此需要你确保能够读取到你client端输入的命令。

另外你的代码中,line直接赋值了null,是不对的,即使你执行了命令,在下面的while判断中也会报空指针的,这一行代码:

while(!line.equals("bye")) 

将line初始化修改一下。

此外,不建议使用BufferedReader方法来读取client端传送的内容,因为你要在client中输入命令的话,必须手动加上

\r\n 

否则server端读取不到你输入的命令,readLine是以换行符为读取结束的。你可以参考下这个里面介绍的读写方法。http://www.cnblogs.com/xignzou/p/3202346.html

danielinbiti
danielinbiti   Ds   Rxr 2015.07.08 23:55
is.readLine()有输入时才能往下执行,不然就阻塞等待。
 System.out.println(is.readLine());//这里读取输入数据了
        Runtime.getRuntime().exec(is.readLine());//这里读取不到了,只能等待
改成
String str = is.readLine();
 System.out.println(str);
        Runtime.getRuntime().exec(str);

weixin_28786647
weixin_28786647   2015.07.09 00:30

可用局部变量替代is.readline()

caozhy
caozhy   Ds   Rxr 2015.07.08 23:56

可以的,看下路径。路径用反斜杠\

http://blog.sina.com.cn/s/blog_3d731e9001000ajm.html

caozhy
caozhy   Ds   Rxr 2015.07.08 23:57

可以的,看下路径。路径用反斜杠\\

yuke198907
yuke198907   2015.07.09 08:21

先判断System.out.println(is.readLine());这句有输出吗,然后再一步一步判断

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Runtime.getRuntime().exec()的使用
转自:http://blog.sina.com.cn/s/blog_3d731e9001000ajm.html 今天发现了Runtime.getRuntime().exec()新的使用方法: //测试结果:能打开,但是需要关闭文件才能中止程序。 //String[] cmd = {"notepad.exe","F:\\long_cennect.txt"}; //Process pr
Java运行Windows Dos bat脚本:Runtime.getRuntime().exec
博客源址: Runtime.getRuntime().exec 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:    ...    Process   process   =   Runtime.getRuntime().exec( ".//p.ex
Runtime.getRuntime().exec(“cat /proc/kmsg”)不成功
这几天一直在android5.1下想办法在系统服务中来实时获取内核日志信息,于是想通过JVM运行时环境直接来执行"cat /proc/kmsg"来获取内核日志。具体获取代码如下: Process logcatProc = Runtime.getRuntime().exec(“cat /proc/kmsg”); BufferedReader mReader = new BufferedReader
Java使用Runtime.getRuntime().exec()时的运行输出 问题解决
问题:在Java中使用Runtime.getRuntime().exec()启动一个进程,发现该进程成功启动,但无法获得该进程的打印输出,网上浏览一番,发现一方案,经验证可行,整理一下贴出来备忘。 /* *Main */ public class StreamOutputTest{ public static void main(String[] args)  {
windows下通过Runtime.getRuntime().exec.()执行linuxshell脚本
windows下通过Runtime.getRuntime().exec.()执行linuxshell脚本 开源中国 发表于 2014-08-26 19:48:12 执行Runtime.getRuntime().exec("ps -ef|grep indexer"); 一直抛ERROR: Unsupported SysV option.   于是便去就
通过Runtime.getRuntime().exec使用Linux脚本
很多时候开发者非常方便地在shell命令窗口使用的命令行进行一些查看操作文件操作修改权限等,也希望能够在程序中直接使用相关的命令直接操作系统; 于是Java提供了一个这样的接口RunTime; Runtime Class Overview ----------------------------------------------------------------------------
Runtime.getRuntime().exec执行阻塞问题解决
上篇博文中CallMaxentThreadPoolTask类直接使用Runtime.getRuntime().exec方法调用cmd命令,结果今天在测试时发现当cmd命令执行 出现错误或警告时,主控程序的waitfor方法会被阻塞一直等待下去,查了查资料发现是Runtime.getRuntime().exec方法需要自己处理stderr 及stdout流,而解决方法即是将它们导出用别的thread处理。 会造成阻塞的代码: Process p = Runtime.getRuntime().exec
Android Runtime.getRuntime().exec() 使用方法
Android 可以通过Runtime.getRuntime().exec()方法来执行命令或者创建进程。 1. Runtime.getRuntime().exec共有六个重载方法: public Process exec(String command) 在单独的进程中执行指定的字符串命令。 public Process exec(String [] cmdArra
Runtime.getRuntime().exec()方法的使用
在公司项目中需要调用外包的命令脚本语言来实现功能,Jdk中提供了Runtime.getRuntime().exec()方法来执行。 1.错误的使用方式Runtime.getRuntime().exec("xxx");2.正确的使用方式//需要指定参数一:命令位置;参数二:-c表示先执行第一个参数;参数三:你的命令。 Runtime.getRuntime().exec(new String[]{"/
多线程Runtime.getRuntime().exec常见问题
JAVA调用一个bat批处理程序,调用几十次后会莫名的不再执行,无任何异常抛出。千试万试,LOG精细到逐行,只知道走到Runtime.getRuntime().exec()程序就停止了,但打死不知道为什么。那真以为里面有鬼。后来寻摸着Runtime.getRuntime().exec()有问题,真给我找到答案了。 大概原因是,调用Runtime.getRuntime().exec()后,如果不及