如何在内存中创建新的java.io.文件?

2022-08-31 08:30:26

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

我正在使用Java语言。我不想将文件保存在硬盘驱动器上。

我面临着一个糟糕的API()。它期待.我没有文件(只有内容),可以创建临时文件,但这不是美丽的解决方案。我需要验证已签名罐的摘要。java.util.jar.JarFileFile fileString filenamebyte[]

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

有关如何在不创建临时文件的情况下实现获取清单的任何示例都将不胜感激。


答案 1

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

也许你感到困惑,并且:FileStream

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

您可以使用 ByteArrayInputStream 和 ByteArrayOutputStream 以与从文件读取和写入类似的方式从字节缓冲区读取和写入,从而基于驻留在内存中的字节缓冲区创建流。该数组包含“文件”的内容。那么就不需要对象了。byteFile

流 和 流分别从 和 继承,以便您可以使用公共超类来隐藏是从文件读取还是从字节数组读取。File...ByteArray...java.io.OutputStreamjava.io.InputStream


答案 2

无法创建将其内容保存在(Java 堆)内存中的一个 *。java.io.File

相反,通常您会使用流。要写入流,请在内存中使用:

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

但遗憾的是,流不能用作 的输入,正如您所提到的,流只能使用包含有效 JAR 文件的路径的 a 或 a。我相信使用像您目前这样的临时文件是唯一的选择,除非您想使用其他API。java.util.jar.JarFileFileString

如果您可以使用不同的API,则可以方便地在同一包中使用名为“您可以使用”的类。只需将数组包装在 中,即可读取 JAR 的内容并提取清单:JarInputStreamarchiveContentByteArrayInputStream

try (JarInputStream stream = new JarInputStream(new ByteArrayInputStream(archiveContent))) {
     Manifest manifest = stream.getManifest();
}

*) 显然可以创建一个驻留在内存中的完整文件系统,就像RAM磁盘一样,但就Java进程而言,它仍然是“在磁盘上”(而不是在Java堆内存中)。