2012-05-16 83 views
0

假設無盤情況下,我如何(在Java中)從內存中解壓縮的exe文件(以及各自的支持文件)創建一個進程?java - 從內存中創建進程

我已經看到了將其解壓到內存herehere但無法找到一個方法來創建一個從字節[]或InputStream中,即過程沒有(文件系統)命令字符串。

想法將第三方組件捆綁到Java應用程序/項目中,而不允許它獨立使用,因此將其捆綁到受密碼保護的Zip中。在我的程序的執行將它解壓縮到內存(EXE +支持文件),併爲後者的OutputStream準備寫,如:

Process process = ? 
OutputStream output = process.getOutputStream(); 
... 
output.write("my commmand to 3rd party component"); 

任何提示?

由於提前,

+0

必須有某種內存中的文件系統,你可以寫可執行文件,不是嗎? – bmargulies

+0

你問如何執行外部程序?如果是這樣,http://www.rgagnon.com/javadetails/java-0014.html – eboix

回答

0

Windows要求進程映像駐留在OS可見的文件系統上。這意味着您需要有一個EXE解壓到的「磁盤」(準確地說,是由內核模式驅動程序公開的全系統可見文件系統)。

我們提供了幾種產品,可用於創建適用於從中啓動EXE的虛擬文件系統,但在所有這些產品中都需要安裝內核模式驅動程序。這正是Windows設計工作的方式。

因此,從流中運行本機EXE(PE格式)不幸的是不會工作。 .NET程序集可以從內存中加載/從內存中加載,並且Java類也可以使用Java運行時功能從任何地方加載,但對於本機進程而言,並非如此。

+0

好的,謝謝。但對於磁盤,我仍然需要使用受密碼保護的zip的內容,而不將它們暴露在文件系統中(如果我將它們放在臨時文件夾中,有人可能會發現它並將第三方組件作爲獨立應用程序使用)。是否有一個「標準」程序來做到這一點(因爲它是在大多數「專業」應用程序和遊戲中完成的)? –

+0

@PeterFialho通過我們的產品,您可以通過虛擬文件系統公開您的數據,但是您可以將對文件系統的訪問限制爲只有系統進程,以便其他人無法訪問它。至於你的第二個問題,我不能評論一般的應用程序和遊戲,但我還沒有看到一個遊戲產生了一個沒有任何東西在磁盤上的過程 –

0

我可以看到幾種可能的方法:

  1. 解壓到內存中的文件系統。
  2. 編寫自定義class loader,可直接從ZIP文件加載類。

在這兩者中,第一個可能需要較少的工作。

+1

我認爲方法#2是不可能的,因爲彼得要求執行「exe +支持文件」,這暗示了非Java在Windows上可執行。所以這隻留下了Ramdisk方法。 – Kosi2801

+0

沒錯,它是一個非Java第三方組件。我不知道ram文件系統,現在正在檢查Apache Commons VFS。謝謝! –