如何创建一个新的Javaio.内存中的文件?[副本]

wpcxdonn  于 2023-04-28  发布在  Java
关注(0)|答案(4)|浏览(147)

此问题已在此处有答案

How to read file from ZIP using InputStream?(7个回答)
1年前关闭。
如何在内存中而不是硬盘上创建新的File(从java.io)?
我使用Java语言。我不想把文件保存在硬盘上。
我遇到了一个糟糕的API(java.util.jar.JarFile)。它需要File fileString filename。我没有文件(只有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();

任何关于如何在不创建临时文件的情况下获取清单的示例都将受到欢迎。

2w3rbyxf

2w3rbyxf1#

如何创建新文件(来自 www.example.com )在内存中,而不是在硬盘中?
您可能会混淆FileStream

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

您可以基于驻留在内存中的字节缓冲区创建流,方法是使用ByteArrayInputStreamByteArrayOutputStream读取和写入字节缓冲区,类似于读取和写入文件。byte数组包含“文件”的内容。你不需要一个File对象。
File...ByteArray...流分别继承自java.io.OutputStreamjava.io.InputStream,因此可以使用公共超类来隐藏是从文件还是从字节数组阅读。

mitkmikd

mitkmikd2#

不可能创建一个java.io.File,将其内容保存在(Java堆)内存 * 中。
相反,通常您会使用流。要写入内存中的流,请用途:

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

但不幸的是,流不能用作java.util.jar.JarFile的输入,正如您提到的,它只能使用包含有效JAR * 文件 * 路径的FileString。我相信使用一个临时文件就像你现在做的那样是唯一的选择,除非你想使用一个不同的API。
如果您可以使用不同的API,那么在同一个包中有一个名为JarInputStream的类可以方便地使用。只需将archiveContent数组 Package 在ByteArrayInputStream中,即可读取JAR的内容并提取清单:

byte[] content = getContent(); // from OP's code

try (JarInputStream stream = new JarInputStream(new ByteArrayInputStream(content))) {
     Manifest manifest = stream.getManifest();
}
  • )显然可以创建一个驻留在内存中的完整文件系统,比如RAM磁盘,但就Java进程而言,它仍然是“在磁盘上”(而不是在Java堆内存中)。
ajsxfq5m

ajsxfq5m3#

您可以使用内存中的文件系统,如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);
sz81bmfz

sz81bmfz4#

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

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

有一个关于here的答案。

相关问题