4

あるディレクトリから別のディレクトリにファイルをコピーするためにgetRuntime()APIを使用して小さなJavaコードを作成しましたが、失敗しました。理由がわかりません。シェルからコマンドを実行すると、正常に実行されます。誰でも、私が行っている間違いを教えてください。

    private static void copyFilesLinux(String strSource, String strDestination) {

    String s;
    Process p;
    try {
        // cp -R "/tmp/S1/"*  "/tmp/D1/"
        p = Runtime.getRuntime().exec(
                "cp -R '" + strSource + "/'* '" + strDestination + "/'");
        System.out.println("cp -R \"" + strSource + "/\"* \"" + strDestination + "/\"");
        System.out.println("cp -R '" + strSource + "/'* '" + strDestination + "/'");
        System.out.println(p.toString());
        BufferedReader br = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        while ((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println("exit: " + p.exitValue());
        p.destroy();
    }
    catch (InterruptedException iex) {
        iex.printStackTrace();
    }
    catch (IOException iox) {
        iox.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

}

出力:

cp -R "/tmp/S1/"* "/tmp/D1/"

cp -R '/tmp/S1/'* '/tmp/D1/'

java.lang.UNIXProcess@525483cd

exit: 1
4

4 に答える 4

4

以下のコードで動作します、

            String[] b = new String[] {"bash", "-c", "cp -R \"" + strSource + "/\"* \"" + strDestination + "/\""};  
        p = Runtime.getRuntime().exec(b);

私はそれをグーグルで検索し、リンクを見つけました

http://www.coderanch.com/t/423573/java/java/Passing-wilcard-Runtime-exec-command

于 2013-03-07T09:35:05.677 に答える
2

のバリエーションを使用するRuntime.exec()と、バイナリはシェルを介してではなく、直接呼び出されます。つまり、ワイルドカードを展開するシェルがないため、ワイルドカードはサポートされていません。

Javaコードを使用してファイルをコピーすることをお勧めします。これは、はるかに移植性が高く、はるかに安全です。それを除けば、シェルバイナリを使用して、そのオプションを介してコマンドを実行できます-c

于 2013-03-07T07:53:04.037 に答える
1

システムコマンドを実際に実行する必要がない限り、標準のJavaAPIを使用してこれを行うことができます。

http://docs.oracle.com/javase/tutorial/essential/io/copy.html

于 2013-03-07T07:45:57.873 に答える
1

次のコードでうまくいきました。

 public static void main(String []args) throws Exception{
        String s;
        Process p;
        try {
            String b[] = new String[4];
            b[0] = "cp";
            b[1] = "-R";
            b[2] = "HelloWorld.java";
            b[3] = "abc.java";

            p = Runtime.getRuntime().exec(b);
            BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            p.waitFor();
            System.out.println ("exit: " + p.exitValue());
            p.destroy();
        } catch (Exception e) {}        
     }
}

コマンドのを作成し、そのString[]中にコマンドを渡します。

于 2017-03-11T03:50:47.643 に答える