此问题已在此处有答案:
How to read file from ZIP using InputStream?(7个回答)
1年前关闭。
如何在内存中而不是硬盘上创建新的File
(从java.io
)?
我使用Java语言。我不想把文件保存在硬盘上。
我遇到了一个糟糕的API(java.util.jar.JarFile
)。它需要File file
或String 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();
任何关于如何在不创建临时文件的情况下获取清单的示例都将受到欢迎。
4条答案
按热度按时间2w3rbyxf1#
如何创建新文件(来自 www.example.com )在内存中,而不是在硬盘中?
您可能会混淆
File
和Stream
:File
是文件和目录路径名的抽象表示。使用File
对象,您可以访问文件系统中的文件元数据,并对该文件系统中的文件执行一些操作,如删除或创建文件。但是File
类不提供读取和写入文件内容的方法。Stream
对象,如FileInputStream
或FileOutputStream
。这些流可以从File
对象创建,然后用于读取和写入文件。您可以基于驻留在内存中的字节缓冲区创建流,方法是使用
ByteArrayInputStream
和ByteArrayOutputStream
读取和写入字节缓冲区,类似于读取和写入文件。byte
数组包含“文件”的内容。你不需要一个File
对象。File...
和ByteArray...
流分别继承自java.io.OutputStream
和java.io.InputStream
,因此可以使用公共超类来隐藏是从文件还是从字节数组阅读。mitkmikd2#
不可能创建一个
java.io.File
,将其内容保存在(Java堆)内存 * 中。相反,通常您会使用流。要写入内存中的流,请用途:
但不幸的是,流不能用作
java.util.jar.JarFile
的输入,正如您提到的,它只能使用包含有效JAR * 文件 * 路径的File
或String
。我相信使用一个临时文件就像你现在做的那样是唯一的选择,除非你想使用一个不同的API。如果您可以使用不同的API,那么在同一个包中有一个名为
JarInputStream
的类可以方便地使用。只需将archiveContent
数组 Package 在ByteArrayInputStream
中,即可读取JAR的内容并提取清单:ajsxfq5m3#
您可以使用内存中的文件系统,如Jimfs
下面是他们自述文件中的一个用法示例:
sz81bmfz4#
我认为临时文件可能是另一种解决方案。
有一个关于here的答案。