如何在内存中创建一个新的 java.io.File?

如何在内存中创建新的 File(从 java.io) ,而不是在硬盘上?

我正在使用 Java 语言。我不想把文件保存在硬盘上。

我面临着一个糟糕的 API (java.util.jar.JarFile)。它期待 String filenameFile file。我没有文件(只有 byte[]的内容) ,可以创建临时文件,但它不漂亮的解决方案。我需要验证签名罐的摘要。

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();

如果有关于如何在不创建临时文件的情况下获取清单的任何示例,我们将不胜感激。

131922 次浏览

如何在内存中创建新的 File (从 java.io) ,而不是在硬盘中?

也许你把 FileStream搞混了:

  • File是文件和目录 路径名的抽象表示。使用 File对象,您可以访问文件系统中的文件元数据,并对该文件系统中的文件执行一些操作,如删除或创建文件。但是 File类不提供读写文件内容的方法。
  • 要从文件读写,您使用的是 Stream对象,如 FileInputStreamFileOutputStream。这些流可以从 File对象创建,然后用于读取和写入文件。

您可以创建一个 基于驻留在内存中的字节缓冲区的流,通过使用一个 ByteArrayInputStream和一个 ByteArrayOutputStream来读取和写入 字节缓冲区,就像您从文件读取和写入一样。byte数组包含“ File’s”内容。那么您就不需要 File对象了。

File...ByteArray...流分别继承自 java.io.OutputStreamjava.io.InputStream,因此可以使用公共超类来隐藏从文件还是字节数组中读取的内容。

不可能创建一个在(Java 堆)内存中保存其内容的 java.io.File * 。

相反,通常你会使用一个流。要写入一个流,在内存中,使用:

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

但不幸的是,流不能用作 java.util.jar.JarFile的输入,正如您所提到的,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 堆内存中)。

您可以使用内存中的文件系统,例如 吉姆

下面是他们的自述文件中的一个用法示例:

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);

我认为临时文件可以是另一种解决方案。

File tempFile = File.createTempFile(prefix, suffix, null);
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(byteArray);

有一个关于 给你的答案。