2017-05-01 100 views
-1

我有这样的代码:运行bash命令,保存输出到RAM内存

String command = "dmidecode -t2"; 

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

我想保存命令RAM的输出(所以我只能在实时使用它)。如何将输出保存到RAM中的字符串?

+0

可能重复的[Java:popen() - like function?](http://stackoverflow.com/questions/2887658/java-popen-like-function) – ceving

回答

-1

您可以使用sun.misc.Unsafe类,它可以让您直接使用JVM内存。
它的构造函数是私有的,所以,你可以得到一个不安全的情况是这样的:

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

然后,您可以让您的字符串字节:

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

您现在可以分配内存的大小和写字符串中的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 

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

+0

虽然这个链接可能回答这个问题,但它更好在这里包括答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/15999083) – EJoshuaS

+1

哦,我没有想到这种可能性。 好吧,我正在写一个基于该页面内容的新答案。 感谢您的建议! –

0

所有相关流都可以使用Process#getOutputStream(),Process#getInputStream(),Process#getErrorStream()之一。

您不应该在乎它们是否保存在RAM中:您可以在进程仍在运行时读取stdout。

相关问题