如何在 java 程序中启动外部程序 [重复]

How to start an external program inside a java program [duplicate]

提问人:Chris Bour 提问时间:7/24/2013 更新时间:7/24/2013 访问量:154

问:

我是如何在另一个 java 程序中启动程序的新手!我不知道如何称呼它。第一个问题是我必须在新线程中执行此操作?第二个问题是如何调用新程序。我想称之为“wondershaper”的程序。我使用 ubuntu 12.04 运行这个程序,并在命令行中编写。“sudo wondershaper eth0 10000 1000”. 我怎样才能在一般程序中编写它? 我有一台服务器,我想处理它的速度!这就是我使用它的原因。所以我有一个多线程服务器,代码是

class Client extends Thread {
    private Socket connectionSocket;


    public Client(Socket c) throws IOException {
        connectionSocket = c;
    }

    public void run() {

        String path = "C:/pao/new2/";

        File folder = new File(path);
        File[] listOfFiles = folder.listFiles();


        try {

            String fileToSendStr = readFile();
            File fileToSend = null;
            for (File f : listOfFiles)

            {               
                if (f.getName().equals(fileToSendStr)) {
                    fileToSend = f;
                    break;
                }
            }
            //System.out.println("Connescting to Client to recieve the part " +fileToSendStr);
            if (fileToSend == null) {

            }
            System.out.println("Sending the chunk to Client " + fileToSendStr + "to the client: " +connectionSocket.getRemoteSocketAddress().toString());
            java.util.Date date= new java.util.Date();
             System.out.println(new Timestamp(date.getTime()));
            long length = fileToSend.length();
            byte [] longBytes = new byte[8];
            ByteBuffer bbuffer = ByteBuffer.wrap(longBytes);
            bbuffer.putLong(length);
            connectionSocket.getOutputStream().write(longBytes);

            BufferedOutputStream bout = new BufferedOutputStream(connectionSocket.getOutputStream());
            BufferedInputStream bain = new BufferedInputStream(new FileInputStream(fileToSend));

            byte buffer [] = new byte [1024];
            int i = 0;
            while((i = bain.read(buffer, 0, 1024)) >= 0){

                bout.write(buffer, 0, i);


            }



            System.out.println("chunk sended");
            java.util.Date date1= new java.util.Date();
             System.out.println(new Timestamp(date1.getTime()));
            bout.close();
            bain.close();


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private String readFile() throws IOException {

        BufferedReader r = new BufferedReader(new InputStreamReader(
                connectionSocket.getInputStream()));
        return r.readLine();

    }
}

所以当我阅读客户端发送给我的 readFile 时。之后,如果是速率字符串,则启动“wondershaper”并将速率放入“sudo wondershaper eth0 10000 rate”中并启动程序

爪哇岛

评论

0赞 D.R. 7/24/2013
我不是 100% 确定,但我想您正在寻找 Java 的 Process 类。
0赞 Vitaly Olegovitch 7/24/2013
相关问题:stackoverflow.com/questions/3643939/...

答:

1赞 Ankit 7/24/2013 #1

Process aProcess = Runtime.getRuntime().exec("cmd");您可以在此处传递任何流程

您还可以读取此程序的输出。

InputStream is = aProcess.getInputStream();

附言:您可以传递任何进程以及参数,但不能传递诸如 >>、2> 或 |或通配符,如 *

-- 来自评论

评论

0赞 Vitaly Olegovitch 7/24/2013
你可以传递任何进程,但你不能传递类似 或>>2>|
0赞 user2277872 7/24/2013
是的,运行时类的学习非常重要,并且在许多情况下处理控制台方案时非常有用
0赞 Ankit 7/24/2013
@VitalijZadneprovskij,如果 shell 支持,则可以通过。
0赞 Ankit 7/24/2013
但除了通配符字符
0赞 Vitaly Olegovitch 7/24/2013
@ay89我在 Linux 环境中尝试过,但它不起作用。它们被视为要传递给要调用的进程的参数。也许在这种情况下,您必须使用bash cmd arg1 arg2 argN >> output.txt