2017-05-01 1 views
-1

Ich habe diesen Code:Run bash Befehl und speichern Ausgabespeicher rammen

String command = "dmidecode -t2"; 

try { 
     Process pb = new ProcessBuilder("/bin/bash", "-c", command).start(); 
    } 
catch (IOException e) { 
    e.printStackTrace(); 
} 

Ich möchte die Ausgabe des Befehls an RAM speichern (so kann ich es nur in Echtzeit verwenden). Wie kann ich die Ausgabe in eine Zeichenfolge im RAM speichern?

+0

Mögliche Duplikate von [Java: popen() - ähnliche Funktion?] (Http://stackoverflow.com/questions/2887658/java-popen-like-function) – ceving

Antwort

-1

Sie können die Klasse sun.misc.Unsafe verwenden, mit der Sie direkt mit dem JVM-Speicher arbeiten können.
Der Konstruktor ist privat, also können Sie eine Unsichere weise wie folgt erhalten:

public static Unsafe getUnsafe() { 
    try { 
      Field f = Unsafe.class.getDeclaredField("theUnsafe"); 
      f.setAccessible(true); 
      return (Unsafe)f.get(null); 
    } catch (Exception e) { /* ... */ } 
} 

Sie können mit Ihrem String-Bytes dann erhalten:

byte[] value = []<your_string>.getBytes() 
long size = value.length 

Sie können nun die Speichergröße zuweisen und die schreiben String im RAM:

long address = getUnsafe().allocateMemory(size); 
getUnsafe().copyMemory(
      <your_string>,  // source object 
      0,    // source offset is zero - copy an entire object 
      null,   // destination is specified by absolute address, so destination object is null 
      address, // destination address 
      size 
); 
// the string was copied to off-heap 

Quelle: https://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/

+0

Während dieser Link die Frage beantworten kann, ist es besser um die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/15999083) – EJoshuaS

+1

Oh, ich habe nicht über diese Möglichkeit nachgedacht. Ok, ich schreibe eine neue Antwort basierend auf dem Inhalt dieser Seite. Danke für den Hinweis! –

0

Alle relevanten Streams sind unter Verwendung von Process#getOutputStream(), Process#getInputStream(), Process#getErrorStream() verfügbar.

Es sollte Ihnen egal sein, ob sie im RAM gespeichert sind oder nicht: Sie können stdout lesen, während der Prozess noch läuft.