簡體   English   中英

如何在內存中創建一個新的 java.io.File?

[英]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)?

也許你混淆了FileStream

  • File是文件和目錄路徑名的抽象表示。 使用File對象,您可以訪問文件系統中的文件元數據,並對該文件系統上的文件執行一些操作,例如刪除或創建文件。 但是File類不提供讀寫文件內容的方法。
  • 要讀取和寫入文件,您需要使用Stream對象,例如FileInputStreamFileOutputStream 這些流可以從File對象創建,然后用於讀取和寫入文件。

您可以基於駐留在內存中的字節緩沖區創建,方法是使用ByteArrayInputStreamByteArrayOutputStream以類似於從文件中讀寫的方式讀取和寫入字節緩沖區 byte數組包含“文件”的內容。 那時您不需要File對象。

File...ByteArray...流分別繼承自java.io.OutputStreamjava.io.InputStream ,因此您可以使用通用超類來隱藏您是從文件讀取還是從字節讀取陣列。

無法創建將其內容保存在(Java 堆)內存中的java.io.File *。

相反,通常您會使用流。 要在內存中寫入流,請使用:

OutputStream out = new ByteArrayOutputStream();
out.write(...);

但不幸的是,流不能用作java.util.jar.JarFile輸入,正如您提到的,它只能使用包含有效 JAR文件路徑的FileString 我相信像您目前所做的那樣使用臨時文件是唯一的選擇,除非您想使用不同的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM