» »

[java] Runtime.exec()

[java] Runtime.exec()

borchi ::

naj mi kdo pomaga pognat dos okno (COMMAND.COM) iz jave v Windows 95/98. PLIZ!!!

v WinXP je to enostavno:

Runtime rt = Runtime.getRuntime();
String[] callAndArgs = { "cmd.exe", "/C", "START /WAIT" };
try {
Process child = rt.exec(callAndArgs);
child.waitFor();
} catch(IOException e) {
System.err.println("IOException starting process!");
} catch(InterruptedException e) {
System.err.println("Interrupted waiting for process!");
}


v Win98 pa to ne špila, če namesto cmd.exe kličem command.com. dos okno mi "obvisi", predpostavljam, da bi mogu kj nardit z vhodnimi/izhodnimi tokovi. kako? kakšen namig?
l'jga

borchi ::

BUMP!

1. stvar je preveč enostavna, da bi se kdo s tem ukvarjal 5 sec?
2. ni mogoče izvest?
3. nihče ne uporablja več win98?
l'jga

kopernik ::

Jaz bi ti rade volje poizkusil pomagati, vendar nimam dostopa do kakih win95 ali win98, tako da ne morem preveriti tvojega problema.

Sergio ::

enako pri meni, zal...
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

borchi ::

ok, kk bi pa potem nardili v winXP, če bi hotel pognati samo "cmd.exe" brez parametrov "/C START /WAIT"? upam, da pridem do istega problema?

hvala!
l'jga

kopernik ::

Pač ne daš parametrov zraven. Npr.

 Process child = rt.exec("cmd.exe");

borchi ::

probej v winXP dobi output/input če tako poženeš.
l'jga

kopernik ::

Ja, program čaka na input. "cmd.exe" čaka na nek ukaz, zato zadeva ne špila. Dela pa naslednje:

  public static void main(String[] args) throws Exception
  {
    Process proc = Runtime.getRuntime().exec("cmd.exe");

    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
    out.write("cd \\\n"); //cmd-ju smo poslali ukaz "cd \"
    out.close();
    
    int exitValue = proc.waitFor();
    System.out.println("Process exited with value " + exitValue + "\n\n");
    
    InputStream in = null;
    try
    {
      in = proc.getInputStream();
      BufferedReader processOutput = new BufferedReader(new InputStreamReader(in));

      String line;
      while((line = processOutput.readLine()) != null)
      {
        System.out.println(line);
      }
    }
    finally
    {
      in.close();
    }
  }


-----------------------------
Output je sledeč:

Process exited with value 0


Microsoft Windows XP [Version 5.1.2600]
© Copyright 1985-2001 Microsoft Corp.

C:\Projects>cd \

C:\>

Zgodovina sprememb…

  • spremenil: kopernik ()

borchi ::

aha, sam to je tako, da poženeš proces, poloviš output in ga spljuneš ven, ko je proces že zaključen. js rabim "realtime" oz. interakcijo. mi lahko daš kak nasvet glede tega? al pa če mi že kr ribo uloviš (prosto po kitajcih) :D

sicer ne vem, če bo to delalo v win98, trenutno imam tut jaz pod prsti samo winXP :-( ampak drugače bo pa mal za vajo.
l'jga

kopernik ::

Malce težko ti čez vikend pomagam, ker imam doma linux. Mogoče bom kaj čez vikend skočil v službo, kjer je nekaj mašin z winXP.

Glede interakcije ... s tem nimam prav dosti izkušenj na tak način. Če bom imel čas, bom pogledal.

kopernik ::

Evo, na hitro spackana rešitev za bash v linuxu:


public class TestProcess
{
  public static void main(String[] args) throws Exception
  {
    Process proc = Runtime.getRuntime().exec("bash");

    OutputStream out = proc.getOutputStream();
    out.write("ls -al\n".getBytes()); //izpis working direktorija
    out.flush();
    
    System.out.println(new String(convertStream(proc.getInputStream())));
    
    out.write("more .classpath\n".getBytes()); //izpis datoteke .classpath
    out.flush();
    out.close();
    
    System.out.println(new String(convertStream(proc.getInputStream())));
  }
  
  private static byte[] convertStream(InputStream in) throws IOException
  {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int size = 0;
    byte[] buffer = new byte[4096];
    
    while((size = in.read(buffer)) != -1)
    {
      out.write(buffer, 0, size);
      if(size < buffer.length)
      {
        break;
      }
    }
    
    return out.toByteArray();
  }
}



Še output:


drwxr-xr-x 6 jan users 224 2004-08-15 15:41 .
drwxr-xr-x 3 jan users 72 2004-08-15 15:38 ..
-rw-r--r-- 1 jan users 267 2004-08-15 15:41 .classpath
drwxr-xr-x 2 jan users 48 2004-08-15 15:39 dist
drwxr-xr-x 2 jan users 48 2004-08-15 15:39 documentation
drwxr-xr-x 5 jan users 128 2004-08-15 15:40 implementation
-rw-r--r-- 1 jan users 372 2004-08-15 15:38 .project
drwxr-xr-x 2 jan users 96 2004-08-15 15:41 .settings

::::::::::::::
.classpath
::::::::::::::
< ?xml version="1.0" encoding="UTF-8"?>
< classpath>
< classpathentry kind="src" path="implementation/sources/java"/>
< classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
< classpathentry kind="output" path="implementation/build"/>
< /classpath>



V winXP bi moralo podobno delati za cmd.exe, ni pa nujno. Poglej si malo javansko dokumentacijo o razredu Process. To je precej sivo področje, ker oper. sistemi različno upravljajo s procesi in težave se lahko hitro pojavijo. Tak način uporabe Jave se mi zdi malo mimo, vendarče ti to rabiš ...

Zgodovina sprememb…

  • spremenil: kopernik ()

borchi ::

najlepša hvala! bom se jutri malo zabaval s tem.
l'jga


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] HTTPS client

Oddelek: Programiranje
173182 (1912) peterv6i
»

Java skeniranje map in podmap

Oddelek: Programiranje
61157 (1046) nightrage
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
223181 (3181) morbo
»

[Java]Brane spletne strani preko https

Oddelek: Programiranje
112145 (1964) CWIZO
»

Kako pošiljanje datotek v JAVI.

Oddelek: Programiranje
141843 (1714) kopernik

Več podobnih tem