[英]How to create a new java.io.File in memory?
如何在內存中而不是在硬盤上創建新File
(來自java.io
)?
我正在使用 Java 語言。 我不想將文件保存在硬盤上。
我遇到了一個糟糕的 API ( java.util.jar.JarFile
)。 它期待String filename
File file
。 我沒有文件(只有byte[]
內容)並且可以創建臨時文件,但這不是很好的解決方案。 我需要驗證簽名 jar 的摘要。
byte[] content = getContent();
File tempFile = File.createTempFile("tmp", ".tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(archiveContent);
JarFile jarFile = new JarFile(tempFile);
Manifest manifest = jarFile.getManifest();
任何有關如何在不創建臨時文件的情況下獲取清單的示例將不勝感激。
如何在內存中而不是在硬盤中創建新文件(來自 java.io)?
也許你混淆了File
和Stream
:
File
是文件和目錄路徑名的抽象表示。 使用File
對象,您可以訪問文件系統中的文件元數據,並對該文件系統上的文件執行一些操作,例如刪除或創建文件。 但是File
類不提供讀寫文件內容的方法。Stream
對象,例如FileInputStream
或FileOutputStream
。 這些流可以從File
對象創建,然后用於讀取和寫入文件。 您可以基於駐留在內存中的字節緩沖區創建流,方法是使用ByteArrayInputStream
和ByteArrayOutputStream
以類似於從文件中讀寫的方式讀取和寫入字節緩沖區。 byte
數組包含“文件”的內容。 那時您不需要File
對象。
File...
和ByteArray...
流分別繼承自java.io.OutputStream
和java.io.InputStream
,因此您可以使用通用超類來隱藏您是從文件讀取還是從字節讀取陣列。
無法創建將其內容保存在(Java 堆)內存中的java.io.File
*。
相反,通常您會使用流。 要在內存中寫入流,請使用:
OutputStream out = new ByteArrayOutputStream();
out.write(...);
但不幸的是,流不能用作java.util.jar.JarFile
輸入,正如您提到的,它只能使用包含有效 JAR文件路徑的File
或String
。 我相信像您目前所做的那樣使用臨時文件是唯一的選擇,除非您想使用不同的 API。
如果您可以使用不同的 API,那么在同一個包中可以方便地使用一個名為JarInputStream
的類。 只需將您的archiveContent
數組包裝在ByteArrayInputStream
,即可讀取 JAR 的內容並提取清單:
try (JarInputStream stream = new JarInputStream(new ByteArrayInputStream(archiveContent))) {
Manifest manifest = stream.getManifest();
}
*) 顯然可以創建一個完整的文件系統駐留在內存中,如 RAM 磁盤,但就 Java 進程而言,它仍然是“在磁盤上”(而不是在 Java 堆內存中)。
您可以使用內存文件系統,例如Jimfs
這是他們自述文件中的用法示例:
FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
Path foo = fs.getPath("/foo");
Files.createDirectory(foo);
Path hello = foo.resolve("hello.txt"); // /foo/hello.txt
Files.write(hello, ImmutableList.of("hello world"), StandardCharsets.UTF_8);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.