Запустите программу C ++, используя Java - PullRequest
0 голосов
/ 07 марта 2011

Я создал программу на Java, которая будет обрабатывать файлы с помощью программы на C ++. Это часть кода, которая вызывает программу на C ++:

public static boolean buildPAKFile(String OSMFile){

        log("Starting building PAK file for " + OSMFile + "...");

        // get name of OSMFile
        String[] OSMFileName = OSMFile.split("\\.");

        try {
            Runtime rt = Runtime.getRuntime();
            Process pr = rt.exec("cat " + OSMFile + " | ../gosmore rebuild " + OSMFileName[0]);

            /*
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

            String line=null;

            while((line=input.readLine()) != null) {
                System.out.println(line);
            }*/

            int exitVal = pr.waitFor();
            System.out.println("Exited with error code "+exitVal);

        } catch(Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

        log("Done building PAK File for " + OSMFile);

        return true;

    }

Когда я раскомментирую часть, которая печатает поток ввода из программы на C ++, появляется бессмысленный текст. Как я могу сделать это правильно? Спасибо!

Добавлено:

Это пример выполнения команды:

cat ncr-sample.osm | ../gosmore rebuild ncr-sample.pak

Building ncr-sample.pak using style /usr/local/share/gosmore/elemstyles.xml...
../gosmore is in the public domain and comes without warranty

...
484 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
485 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
486 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
487 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
488 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
489 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
490 for (pairs = 0; pairs < PAIRS && s2grp < S2GROUP (0) + S2GROUPS; )
491 for (ndType *ndItr = ndBase; ndItr < ndBase + hashTable[bucketsMin1 + 1]; ndItr++)
492 qsort (&lseg[0], lseg.size () / 2, sizeof (lseg[0]) * 2, (int (*)(const void *, const void *))HalfSegCmp)
493 for (int i = 0; i < IDXGROUPS; i++)
Icon public.png not found
Icon public.png not found
Icon religion/synagogue.png not found
Icon religion/mosque.png not found
Icon rendering/landuse/cemetery.png not found
Icon wlan.png not found
Icon rendering/landuse/cemetery.png not found
../gosmore is in the public domain and comes without warranty

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Я узнал с помощью @Adrian Cox, что правильная реализация должна быть такой:

String gosmoreCmd = " cat " + OSMFile + " | ../gosmore rebuild"     
                    + OSMFileName[0] + ".pak";
String[] cmds = {"/bin/bash", "-c", gosmoreCmd};
Process pr = rt.exec(cmds);

/ bin / bash запускает оболочку, которая с -c Параметр, вы можете передать новую команду в эту оболочку.

2 голосов
/ 07 марта 2011

Я видел это раньше .Runtime.exec() не создает оболочку, поэтому не может обрабатывать символы перенаправления оболочки, такие как |.Единственная команда, которую вы запускаете - это начальная cat.Чтобы это исправить, либо передайте файл XML в стандартный ввод подпроцесса, либо заключите цепочку в сценарий оболочки.

...